NilClass - Ruby 继承的真正含义是什么?
NilClass - What does Ruby inheritance really mean?
新手问题。
我假设"inheritance"是Ruby的基本特征。每个 class 都从其 .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 中的真正含义是什么?
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
新手问题。
我假设"inheritance"是Ruby的基本特征。每个 class 都从其 .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 中的真正含义是什么?
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
hasClass
andObject
as its.class
and.superclass
, you'd assumeNilClass
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