From: Rick DeNatale Date: 2007-12-18T01:43:29+09:00 Subject: Re: Inheritance and meta-classes On 12/17/07, Robert Klemme wrote: > 2007/12/17, Rick DeNatale : > > The statement I wanted to correct, maybe I misunderstood it was: > > > > > The meta class is there but it's hidden from #ancestors as you found > > > out. Inheritance wise it sits between an object and its class. > > > > I read object as an instance of "its class." The above statement is > > wrong in two regards. > > But note that any class is also an instance. But that doesn't seem to be relevant to the 'slightly restated assertion that. Inheritance wise the metaclass sits between an object and its class. Let's say that the object is an array, we have array -klass-> Array ->klass-> Array' (i.e. Arrays metaclass) which isn't an inheritance chain anyway, but it illustrates that the metaclass doesn't sit between an instance and its class. Now lets' say the object was a class, say Array we have two parallel inheritance chains: Array Array' | | super super V V Object Object' > Again, since a class is also an instance I choose to use the more > general term. But the statement holds true for classes as well because > with regard to this there is no difference between an ordinary > instance and an instance of Class (or Module for that matter). There > is in fact some difference in behavior that results from this (see my > posting) but the singleton class of a class sits between the instance > (the class) and its class (Class). Yes, but not all singleton classes are metaclasses, I maintain that only singleton classes of classes are properly called metaclasses. The meaning of metaclass is "class of a class", so calling the singleton class of a non-class object a metaclass is a misnomer, albeit, sadly, a common one. Given this definition, it only holds true if the object in the general statement is a class which makes the statement incorrect in general. > > > Generally singleton classes of class instances and of ordinary instances > > > behave the same. The only difference I can see so far is that, since > > > classes can inherit from each other, a subclass also shares instance > > > methods defined for its superclass (see my irb session). Btw, something > > > similar happens with instances when cloned: > > Not quite the same, what happens here is that cloning an object with a >> singleton class gives the clone a singleton class which looks like the >> original object's singleton class: > That's why I wrote "similar" and not "same"... The point is that there's no inheritance involved, just copying. > > One last point, you have to be careful in looking at the results from > > experiments like this in irb/ruby programs because some of the > > reflection methods in ruby deliberately lie about what's really > > happening under the covers. > > Can you elaborate which methods do actually lie? Off the top of my head, ancestors for one. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/