0

我曾以为这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,一切都有一个超类,并且nil是 的一个实例NilClass,所以它不能有超类方法。如何获得Object作为超类的Object

4

3 回答 3

5

来自ruby​​-doc.org

BasicObject 是 Ruby 中所有类的父类

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

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

于 2013-04-19T11:04:58.910 回答
4

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

于 2013-04-19T10:58:22.410 回答
1

superclass是一种方法Class。现在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)-----------...

是的,作为nil的对象是正确的NilClass,而后者又继承Object了位于类之上的对象Class。因此Nilclass无法继承superclass方法。

Object.superclass.superclass #=> nil
nil.superclass #=> undefined method error since nil is not a class
于 2013-04-19T11:08:13.073 回答