[MacRuby-devel] How do I subclass Obj-C classes in MacRuby?

Thibault Martin-Lagardette thibault.ml at gmail.com
Thu May 6 21:17:59 PDT 2010


Glad it works :-)

The reason why your example doesn't work is because in MacRuby, String descends from NSString, which is a Foundation object. Foundation objects use "init" and not "initalize", and for syntaxic sugar reasons, #new is aliased to [[obj alloc] init] on Foundation objects :-).

$> macirb --simple-prompt
>> class A < String
>>  def initialize
>>    super
>>    puts "initialize"
>>  end
>>  def init
>>    if super
>>      puts "init"
>>      self
>>    end
>>  end
>> end
=> nil
>> A.new
init
=> ""


On non-Foundation objects, #new behaves as you expect (the ruby way)

$> macirb --simple-prompt
>> class A < Range
>>  def initialize(a, b)
>>    super
>>    puts "range initialize!"
>>  end
>> end
=> nil
>> A.new(1, 2)
range initialize!
=> 1..2

I agree this difference can be confusing, and I think it could find its place in a certain book *stares at Matt*

-- 
Thibault Martin-Lagardette



On May 6, 2010, at 20:51, russell muetzelfeldt wrote:

>> From: Thibault Martin-Lagardette <thibault.ml at gmail.com>
>> 
>> What you can do is a "factory" just like this:
>> 
> ...
> 
>> You can also do a more Cocoa-ish way:
>> 
> ...
> 
>> Hope that helps!
> 
> yep, that all works... I'd rather be doing it in a more Ruby-ish way though... :)
> 
> 
> Is the fact that the Ruby-standard initialize method is not called for Ruby classes descended from Obj-C classes expected? To me, at least, it violates the principle of least surprise...
> 
> for example, in ruby 1.9.1 we see initialize being called
> 
> russm at worcestershire:~$ irb1.9.1 
> irb(main):001:0> class C2 < String
> irb(main):002:1>   attr_accessor :foo
> irb(main):003:1>   def initialize foo = "default2"
> irb(main):004:2>     @foo = foo
> irb(main):005:2>     STDERR.puts "setting #{foo}"
> irb(main):006:2>   end
> irb(main):007:1> end
> => nil
> irb(main):008:0> c2 = C2.new
> setting default2
> => ""
> irb(main):009:0> 
> 
> 
> but not in macruby 0.6
> 
> russm at alcazar:~$ macirb 
> irb(main):001:0> class C2 < String
> irb(main):002:1>   attr_accessor :foo
> irb(main):003:1>   def initialize foo = "default2"
> irb(main):004:2>     @foo = foo
> irb(main):005:2>     STDERR.puts "setting #{foo}"
> irb(main):006:2>   end
> irb(main):007:1> end
> => nil
> irb(main):008:0> c2 = C2.new
> => ""
> irb(main):009:0> 
> 
> 
> _______________________________________________
> MacRuby-devel mailing list
> MacRuby-devel at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel



More information about the MacRuby-devel mailing list