From: Josh Cheek Date: 2010-02-08T16:11:03+09:00 Subject: Re: confused about the superclass --000e0cd1ab1aa671a9047f118043 Content-Type: text/plain; charset=ISO-8859-1 On Sun, Feb 7, 2010 at 9:13 PM, Ruby Newbee wrote: > Hello, > > Please see the code about, why Myclass.superclass is "Object"? But I > think it should be "Module". > > Thanks for your helps. > > class MyClass end MyClass.class # => Class MyClass.superclass # => Object MyClass.ancestors # => [MyClass, Object, Kernel] Class.class # => Class Class.superclass # => Module Class.ancestors # => [Class, Module, Object, Kernel] From here, I see that MyClass's class and superclass are congruent with it's ancestors, and so are Class's. However, I am also a bit confused, it seems that if MyClass inherits from Class, then it should include Module in it's ancestors. I thought about it a bit, and decided to check if included modules of Class are visible to MyClass ---------- module DoYouSeeMe end class Class include DoYouSeeMe end MyClass.class # => Class MyClass.superclass # => Object MyClass.ancestors # => [MyClass, Object, Kernel] Class.class # => Class Class.superclass # => Module Class.ancestors # => [Class, DoYouSeeMe, Module, Object, Kernel] So apparently not. I decided to generalize this into a hypothesis that included modules are not visible to subclasses. ---------- class MyClass include DoYouSeeMe end class MyInheritedClass < MyClass end MyClass.class # => Class MyClass.superclass # => Object MyClass.ancestors # => [MyClass, DoYouSeeMe, Object, Kernel] MyInheritedClass.class # => Class MyInheritedClass.superclass # => MyClass MyInheritedClass.ancestors # => [MyInheritedClass, MyClass, DoYouSeeMe, Object, Kernel] ---------- class MyClass include DoYouSeeMe end class MySubClass < MyClass end MyClass.class # => Class MyClass.superclass # => Object MyClass.ancestors # => [MyClass, DoYouSeeMe, Object, Kernel] MySubClass.class # => Class MySubClass.superclass # => MyClass MySubClass.ancestors # => [MySubClass, MyClass, DoYouSeeMe, Object, Kernel] Apparently I was wrong. I thought about it a little bit more, and decided that maybe MyClass didn't inherit from Class, but was rather an instance of class ---------- MyClass.instance_of? Class # => true MySubClass.instance_of? MyClass # => false MyOtherClass = Class.new MyOtherClass.ancestors # => [MyOtherClass, Object, Kernel] This seems to be congruent :) So, my conclusion is that class and superclass behave correctly, in that they reflect their ancestry. And the reason MyClass' ancestry is not a superset of Class' ancestry is because MyClass is not a subclass of Class, but rather an instance of it. ( I tried making a subclass of Class also, but got a TypeError ) Hope that helps, thanks for asking, it was a useful exercise :) --000e0cd1ab1aa671a9047f118043--