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

-- 
http://www.rubypowerandlight.com => Ruby/Rails training & consultancy
http://www.manning.com/black     => RUBY FOR RAILS (reviewed on
                                     Slashdot, 7/12/2006!)
http://dablog.rubypal.com        => D[avid ]A[. ]B[lack's][ Web]log
dblack / wobblini.net              => me