【问题标题】:ruby's nil class' superclass - OOPruby 的 nil 类的超类 - OOP
【发布时间】:2015-11-10 11:10:45
【问题描述】:

我可能想错了,但这对我来说有点奇怪:

我正在浏览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

当我尝试以下操作时,我变得更加困惑:

为什么我可以在Foo 上调用superclass,而不是nil,当我可以分别在他们的每个类上调用超类时(ClassNilClass)-Foonil 是其他一些 class 的实例,它们具有 superclasses。

nil 有什么特别之处? nilNilClass 之间缺少什么,NilClass 将有一个 superclass,而 nil 不会有一个?

【问题讨论】:

    标签: ruby oop


    【解决方案1】:

    BasicObject 的情况下,nil 的返回值表示超类。它表示超类的不存在nil 不是类(nilNilClass 的实例,类是Class 的实例),它是一个代表“缺席”思想的对象。

    只有类有超类。不是类的东西没有cuperclasses。由于nil 不是一个类,它没有超类。还有很多其他的东西没有超类:1 没有超类。 'Hello' 没有超类。 [] 没有超类。事实上,这些对象不仅没有超类,甚至超类的概念对它们也没有意义。

    nilNilClass 的一个实例,NilClass 没有定义superclass 实例方法,它的任何祖先(ObjectKernelBasicObject)也没有定义。

    作为Class的一个实例,NilClass 确实响应superclass消息(因为Class定义了一个superclass实例方法),它的超类是Object .

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

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

    【讨论】:

    • NilClass 确实有一个超类,不过
    • 当然,除了一个之外的所有类都有一个超类。但问题是“是什么让nil 与众不同”,答案是:nil 没有超类并不特别,实际上几乎所有对象都没有超类,只有类有超类。
    • 是的。那么这与答案的最后一句如何结合呢?
    • 我不明白你的问题。我没有看到任何矛盾。
    • "NilClass 没有超类方法", "除一个之外的所有类都有超类", NilClass.superclass # => Object
    【解决方案2】:
    Foo.superclass.superclass.superclass
    

    正在有效地调用fundamental object BasicObjectsuperclass 方法。

    BasicObject没有超类,所以方法返回nil

    nilNilClass 的一个实例,所以它本身不是一个类。

    如果你打电话给nil.class.superclass,你会得到Object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      相关资源
      最近更新 更多