新手问题。
我认为"继承"是Ruby的基本功能。每个类都从.class
和.superclass
继承方法。
由于NilClass
有Class
和Object
作为.class
和.superclass
,因此您假定NilClass
拥有所有方法
当我看到这个时,我的大脑爆炸了:
>> NilClass.class
=> Class
>> NilClass.class.methods - NilClass.methods
=> [:nesting, :new]
>> NilClass.superclass
=> Object
>> NilClass.superclass.methods - NilClass.methods
=> [:new]
发生了什么事?
任何人都可以解释Ruby中整个继承机制的真正底线吗?
继承在Ruby中真正意味着什么?
答案 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
。
由于
NilClass
有Class
和Object
作为.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