我原以为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
的超类?
答案 0 :(得分:5)
BasicObject是Ruby
中所有类的父类
Object的超类是BasicObject,BasicObject 没有超类。不存在事物的标准占位符为nil,因此BasicObject.superclass返回nil。
碰巧nil是NilClass类的一个实例,它是Object的子类。这并不意味着NilClass是BasicObject的超类,或者Object是Object的超类。
答案 1 :(得分:4)
你没有得到“Object作为Object的超类”。你得到的是“对象作为Nilclass的超类”。
答案 2 :(得分: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