On 4/22/07, Philipp Taprogge <Philipp.Taprogge / gmx.net> wrote:
> Hi!
>
> Thus spake apefan / dodgeit.com on 04/21/2007 07:31 PM:
> > Baz#boo and Baz.new.method(:boo).call dosn't produce the same result.
> > Does this surprise anyone?
>
> As far as I understand ruby's dynamic typing, that output is just
> what you would expect:
>
> When you create a new Baz and call it's boo(), you are actually
> holding a class instance to do the dispatching: first the
> module-included boo() is run and that looks for a boo() in the
> _caller's_, i.e. this particular Bar's, superclass.
>
> In the second case, you create a Baz, but then get hold of the
> method itself by a process called "reflection" or "introspection".
> Since everything in ruby is an object, that's what you get: a method
> object representing the method itself.
> So, in this case, you are holding the raw boo() method directly from
> your Bar module. This method object does not know anything at all
> about the instance that provided it, i.e. the new Baz you called
> method() on.
Sorry but this is not true, we get a method object bound to the
instance which can be called without any problem. Look at this code,
just to convince you

512/12 > cat simple.rb && ruby simple.rb
# vim: sts=2 sw=2 expandtab tw=0 nu:

class Baz
  def initialize
    @x = 42
  end
  def boo
    puts "Baz::boo @x=#{@x}"
  end # def boo
end

Baz.new.boo
Baz.new.method(:boo).call


Baz::boo @x=42
Baz::boo @x=42

> It is just a sniplet of code, wrapped in an object for you.
well you are saying it yourself here ;)
> Now, since Bar itself does not have a superclass, a call to super
> _in_this_context_ yields the NoMethodError you encountered.
It does not seem to be right super should just work fine as we are in
the context of a  Baz object and it can search the
self.class.ancestors list, which is
[Baz, Boo, Foo, Object, Kernel]
in both cases, just put
puts self.class.ancestors.inspect
into Boo::boo

The behavior seems wrong to me too , but hopefully a more learned
member of the list will enlighten us.

Cheers
Robert
>
> To cut a long story short,
<snip> ;)
>
Robert

-- 
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw