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