NilClass - Ruby 继承的真正含义是什么?

NilClass - What does Ruby inheritance really mean?

新手问题。

我假设"inheritance"是Ruby的基本特征。每个 class 都从其 .class.superclass.

继承方法

因为 NilClassClassObject 作为它的 .class.superclass,你会假设 NilClass 有他们所有的方法。

然后我看到这个的时候脑子炸了:

>> NilClass.class
=> Class
>> NilClass.class.methods - NilClass.methods
=> [:nesting, :new]
>> NilClass.superclass
=> Object
>> NilClass.superclass.methods - NilClass.methods
=> [:new]

这是怎么回事?

谁能解释一下 Ruby 中整个继承机制背后到底发生了什么?

继承在 Ruby 中的真正含义是什么?

I assumed that "inheritance" is the basic feature of Ruby. And every class inherits methods from both its .class and .superclass.

没错。每个 class 都从它的 superclass 继承方法,默认情况下是 Object

class Foo
end

Foo.superclass #=> Object

Foo 响应 Object 的 class 方法,Foo 实例响应 Object 的实例方法。

此外,每个 class 都是 Class 的实例,因此响应 Class' 实例方法(就像 Foo 实例响应 Foo的实例方法):

Foo.class #=> Class

Foo.method(:new)
#=> #<Method: Class#new>

调用 Foo.new 只是调用 Class#new.

Since NilClass has Class and Object as its .class and .superclass, you'd assume NilClass to have all their methods.

可以,但是 nil 是单例,即只有一个 nil 实例,您不能创建任何其他实例。这是通过 undefining new 实现的(除其他外)。来自 Ruby 的 source code:

rb_undef_method(CLASS_OF(rb_cNilClass), "new");

你可以用普通的方式做同样的事情 Ruby:

Foo.singleton_class.send(:undef_method, :new)
Foo.new
#=> NoMethodError: undefined method `new' for Foo:Class