ruby的nil类'超类 - OOP

时间:2015-11-10 11:10:45

标签: ruby oop

我可能会以错误的方式思考这个问题,但这对我来说有点奇怪:

我正在阅读有关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

当我尝试以下内容时,我更加困惑:

enter image description here

为什么我可以在superclass上呼叫Foo,而不是nil,当我可以分别在每个班级调用超类时Class和{ {1}}) - NilClassFoo都是其他nilclass的实例。

superclass有什么特别之处?在nilnil NilClassNilClass superclassnil之间没有错误的内容之间缺少什么?

2 个答案:

答案 0 :(得分:2)

对于BasicObjectnil的返回值表示超类。它表示超类的缺席nil不是类(nilNilClass的实例,类是Class的实例),它是表示“缺席”概念的对象。 / p>

只有类有超类。不是班级的东西没有铜管。由于nil不是类,因此它没有超类。还有很多其他东西没有超类:1没有超类。 'Hello'没有超类。 []没有超类。事实上,不仅那些对象没有超类,超类的想法对他们来说甚至都没有意义。

nilNilClass的实例,NilClass没有定义superclass实例方法,也没有定义任何祖先(Object,{ {1}},Kernel)。

作为BasicObject的实例,Class 回复NilClass消息(因为superclass定义了Class个实例方法),其超类为superclass

因此,我们对这里缺少的超类有两种不同的解释:

  • Object在您询问其超类时会以BasicObject响应,因为它没有超类。但它仍然是一个类,对于类,关于超类的问题是有道理的,这就是为什么它会回答你的问题,但告诉你“不,我没有”。
  • nilnil以及所有其他不是类的对象甚至会拒绝回答您的问题,因为他们拥有超类的想法没有意义。

答案 1 :(得分:0)

Foo.superclass.superclass.superclass

有效调用fundamental object BasicObjectsuperclass方法。

BasicObject没有超类,因此该方法返回nil

nilNilClass的一个实例,因此本身不是一个类。

如果您致电nil.class.superclass,则会获得Object