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

时间:2015-01-30 06:48:20

标签: ruby inheritance syntax

新手问题。

我认为"继承"是Ruby的基本功能。每个类都从.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中真正意味着什么?

1 个答案:

答案 0 :(得分:2)

  

我认为"继承"是Ruby的基本功能。每个类都从.class.superclass继承方法。

那是对的。每个类都从其超类继承方法,默认情况下为Object

class Foo
end

Foo.superclass #=> Object

Foo回复Object的类方法,Foo个实例回复Object的实例方法。

此外,每个班级都是Class的一个实例,因此会响应Class'实例方法(就像Foo实例响应Foo的实例方法一样):

Foo.class #=> Class

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

致电Foo.new只需调用Class#new

  

由于NilClassClassObject作为.class.superclass,因此您假定NilClass拥有所有方法

它会,但是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