ruby中哪个类是所有类的父类?

时间:2013-04-19 10:53:47

标签: ruby

我原以为Object是所有课程的祖先,但我尝试了让我困惑的事情。

Object.superclass # => BasicObject
Object.superclass.superclass # => nil
Object.superclass.superclass.superclass # => undefined method error since nil is not a class
Object.superclass.superclass.class # => Nilclass
Object.superclass.superclass.class.superclass # => Object

nil外,所有内容都有超类,nilNilClass的实例,所以它不能有超类方法。如何将Object作为Object的超类?

3 个答案:

答案 0 :(得分:5)

来自ruby-doc.org

  

BasicObject是Ruby

中所有类的父类

Object的超类是BasicObject,BasicObject 没有超类。不存在事物的标准占位符为nil,因此BasicObject.superclass返回nil。

碰巧nil是NilClass类的一个实例,它是Object的子类。这并不意味着NilClass是BasicObject的超类,或者Object是Object的超类。

答案 1 :(得分:4)

你没有得到“Object作为Object的超类”。你得到的是“对象作为Nilclass的超类”。

答案 2 :(得分:1)

superclassClass的一种方法。现在NilClass继承自Object。但是类Object没有机会继承类Class方法。

请参阅下面的Documentaion

Classes, modules, and objects are interrelated. In the diagram that follows, the vertical arrows represent inheritance,
and the parentheses meta-classes. All metaclasses are instances of the class `Class'.


                         +---------+             +-...
                         |         |             |
         BasicObject-----|-->(BasicObject)-------|-...
             ^           |         ^             |
             |           |         |             |
          Object---------|----->(Object)---------|-...
             ^           |         ^             |
             |           |         |             |
             +-------+   |         +--------+    |
             |       |   |         |        |    |
             |    Module-|---------|--->(Module)-|-...
             |       ^   |         |        ^    |
             |       |   |         |        |    |
             |     Class-|---------|---->(Class)-|-...
             |       ^   |         |        ^    |
             |       +---+         |        +----+
             |                     |
obj--->OtherClass---------->(OtherClass)-----------...

是的,这是正确的nilNilClass的对象,后者继承Object,它位于班级Class之上。因此Nilclass无法继承superclass方法。

Object.superclass.superclass #=> nil
nil.superclass #=> undefined method error since nil is not a class