Hi -- (Testing a new way of posting to Usenet.... hoping it works....) (Copy to Simon) On Mon, 8 Mar 2004, Simon Strandgaard wrote: > On Mon, 08 Mar 2004 08:35:34 +0900, Yukihiro Matsumoto wrote: > > In message "proposal: class<<obj to invoke extend_object" > > on 04/03/08, Simon Strandgaard <neoneye / adslhome.dk> writes: > > > > |'obj.extend' and 'class<<obj' are close cousins.. > > |However there is a difference.. 'class<<obj' doesn't > > |invoke #extend_object, and #extended. To me it feels > > |inconsistent that there is no way to execute code on the > > |point when the extension occurs. > > > > 'obj.extend' add a module to the inheritance graph (per object base), > > whereas 'class <<obj' add methods and attributes to the existing > > singleton class. Virtually, singleton class always exists for each > > object, never added, never extended. > > > > I don't get this.. (thanks+sorry matz). > > I had the impression that they didn't differ much. > Is there anyone which can explain this to me? When you do "obj.extend(Mod)", obj.ancestors changes (new module added). When you do "class << obj ... end", obj.ancestors stays the same. All you're doing is adding a method to a class; you're not extending obj, in the sense of putting a new module in its ancestry (i.e., method lookup path). If you invoked #extended every time you did this, you'd have to invoke it on every String object if you did: class String #... end Singleton classes are, I think, implemented in such a way that they don't actually have existence until they're first referred to. But, as Matz says, every object virtually has a singleton class all the time. David -- David A. Black dblack / wobblini.net