From: Sean O'Halpin Date: 2006-07-19T06:26:25+09:00 Subject: Re: challenge On 7/18/06, Mauricio Fernandez wrote: > On Sat, Jul 15, 2006 at 10:33:09AM +0900, Sean O'Halpin wrote: > > On 7/14/06, ara.t.howard@noaa.gov wrote: > > >On Fri, 14 Jul 2006, Sean O'Halpin wrote: > > In most cases, this works: > > > > class Foo > > def self.open(*args, &block) > > p [args, block] > > yield if block_given? > > end > > end > [...] > > (class << Foo; self; end).instance_eval do > > define_method(:open, open_m) > > end > [...] > > but as we've seen, it doesn't work in the case of the File(IO) > > singleton. To be honest, I'm not clear about exactly what kind of > > object the File(IO) singleton is. Anyone offer any enlightenment? > > Open is a singleton method of IO, not File; this is why the call fails (in > 1.9, it'd happen earlier, as soon as you try to rebind the method). There's > nothing that special about File itself: > > class X > def self.foo; yield + 1 end > end > > class Y < X > end > > Y.foo{1} # => 2 > m = Y.method(:foo) > def Y.foo; 10 end > Y.foo{1} # => 10 > class << Y; self end.class_eval{define_method(:foo, m)} > Y.foo{1} # => > # ~> -:13:in `foo': singleton method bound for a different object (TypeError) > # ~> from -:13 > > As for the File(IO) notation, it seems to mean that the singleton method > belongs to IO: > > class X; def self.foo; yield + 1 end end > class Y < X; end > Y.method(:foo) # => # > X.method(:foo) # => # > > Keep in mind that the singleton class of a class is derived from that of its > superclass: > > class X; def self.foo; 1 end end > class Y < X; end > X.methods(false) # => ["foo"] > Y.methods(false) # => [] > Y.foo # => 1 > > -- > Mauricio Fernandez - http://eigenclass.org - singular Ruby > > I think that certainly fits the description of enlightenment :) I can see now that my example was missing the essential aspect of using a parent's singleton method in a derived class. And so back to Ara's challenge... Regards, Sean