From: "David A. Black" Date: 2005-04-04T11:30:52+09:00 Subject: Re: signleton_methods / methods / public_methods - weirdness? Hi -- On Mon, 4 Apr 2005, Saynatkari wrote: > David A. Black wrote: >> >> irb(main):001:0> class A; def A.x; end; end; class B < A; end >> => nil >> irb(main):002:0> B.singleton_methods(false) >> => [] >> irb(main):003:0> B.singleton_methods(true) >> => ["x"] >> >> I would argue that there is a bit of a contradiction here, arising >> from the special case of inheritance. x is not really a singleton >> method of B; it's a singleton method of B's superclass, and the rules >> of inheritance allow the (arguably anomalous) behavior that the >> subclass can serve as the receiver for what would otherwise be a truly >> singleton method. >> >> I believe this is the only scenario where, after doing this: >> >> def obj.meth; end >> >> any object other than obj can call meth. In other words, a Class's >> singleton methods ("class methods") don't quite behave in a singleton >> fashion. > > other = obj.clone But in that case, the clone is calling its own singleton method of the same name: irb(main):001:0> a = Object.new => # irb(main):002:0> def a.x; 1; end => nil irb(main):003:0> b = a.clone => # irb(main):004:0> b.x => 1 irb(main):005:0> def a.x; 2; end => nil irb(main):006:0> b.x => 1 (I'm actually not sure whether the 'x' prior to the redefinition of a#x is the same for both objects. If so, it's just an optimization, since b#x is a different method after a#x is redefined.) David -- David A. Black dblack@wobblini.net