Tom Werner
7/19/2006 11:38:00 PM
dblack@wobblini.net wrote:
> Hi --
>
> On Thu, 20 Jul 2006, Tom Werner wrote:
>
>> I've got a question regarding the inner workings of extend. Consider
>> the following code that uses Object#extend twice:
>>
>> class Klass
>> def hello(options = {})
>> p options
>> end
>> end
>>
>> module Mod1
>> def hello(options = {})
>> super(options.merge({:mod1 => true}))
>> end
>> end
>>
>> module Mod2
>> def hello(options = {})
>> super(options.merge({:mod2 => true}))
>> end
>> end
>>
>> k = Klass.new
>> k.hello #=> {}
>>
>> k.extend(Mod1)
>> k.hello #=> {:mod1=>true}
>>
>> k.extend(Mod2)
>> k.hello #=> {:mod2=>true, :mod1=>true}
>>
>> I was a bit surprised that the second extend didn't clobber the
>> first. How is this handled by the Ruby interpreter? Is it creating
>> more than one eigenclass?
>
> No, it's just inserting the modules along the method lookup chain.
> You can examine it like this:
>
> class << k
> p ancestors
> end
>
> which gives you:
>
> [Mod2, Mod1, Klass, Object, Kernel]
>
> So Mod2 comes before Mod1, but the class (k's singleton class) still
> has Mod1 mixed in.
>
>
> David
>
Ah! Have I said I love Ruby today?
Thanks David.
Tom
--
Tom Werner
Helmets to Hardhats
Software Developer
tom@helmetstohardhats.org
www.helmetstohardhats.org