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
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
···
On 4/22/07, Philipp Taprogge <Philipp.Taprogge@gmx.net> wrote:
--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw