我可能会以错误的方式思考这个问题,但这对我来说有点奇怪:
我正在阅读有关ruby's everything is an object on rubymonk的文档,并参与了有关超类的部分,其中包含以下示例:
p Foo.superclass
p Foo.superclass.superclass
p Foo.superclass.superclass.superclass
Foo
是一个类,并得到以下内容:
STDOUT:
Object
BasicObject
nil
我有点困惑,为什么最后一个是nil
,我继续检查:
p Foo.superclass.superclass.superclass.superclass
本来相当于p nil.superclass
,我收到以下错误:
undefined method `superclass' for nil:NilClass
当我尝试以下内容时,我更加困惑:
为什么我可以在superclass
上呼叫Foo
,而不是nil
,当我可以分别在每个班级调用超类时Class
和{ {1}}) - NilClass
和Foo
都是其他nil
个class
的实例。
superclass
有什么特别之处?在nil
和nil
NilClass
将NilClass
superclass
和nil
之间没有错误的内容之间缺少什么?
答案 0 :(得分:2)
对于BasicObject
,nil
的返回值不表示超类。它表示超类的缺席。 nil
不是类(nil
是NilClass
的实例,类是Class
的实例),它是表示“缺席”概念的对象。 / p>
只有类有超类。不是班级的东西没有铜管。由于nil
不是类,因此它没有超类。还有很多其他东西没有超类:1
没有超类。 'Hello'
没有超类。 []
没有超类。事实上,不仅那些对象没有超类,超类的想法对他们来说甚至都没有意义。
nil
是NilClass
的实例,NilClass
没有定义superclass
实例方法,也没有定义任何祖先(Object
,{ {1}},Kernel
)。
作为BasicObject
的实例,Class
会回复NilClass
消息(因为superclass
定义了Class
个实例方法),其超类为superclass
。
因此,我们对这里缺少的超类有两种不同的解释:
Object
在您询问其超类时会以BasicObject
响应,因为它没有超类。但它仍然是一个类,对于类,关于超类的问题是有道理的,这就是为什么它会回答你的问题,但告诉你“不,我没有”。nil
,nil
以及所有其他不是类的对象甚至会拒绝回答您的问题,因为他们拥有超类的想法没有意义。答案 1 :(得分:0)
Foo.superclass.superclass.superclass
有效调用fundamental object BasicObject
的superclass
方法。
BasicObject
没有超类,因此该方法返回nil
nil
是NilClass
的一个实例,因此本身不是一个类。
如果您致电nil.class.superclass
,则会获得Object