pan*_*rey 1 ruby class class-hierarchy object-model
在写下我一再努力理解红宝石的对象模型后,我现在感到困惑:以下是我的观察.
class Bird
def speak
puts "tweet tweet"
end
end
>> Bird.class
=> Class
>> Class.class
=> Class
>> Class.superclass
=> Module
>> Module.class
=> Class
>> Module.superclass
=> Object
>> Object.class
=> Class
>> Object.superclass
=> nil
>> nil.class
=> NilClass
>> NilClass.class
=> Class
>> NilClass.superclass
=> Object
and keeps going on ....
Run Code Online (Sandbox Code Playgroud)
这里发生了什么 ?什么位于祖先的顶点nil或NilClass或Object或Class?Ruby的对象模型是如何组织的.
什么是类,什么是对象?是阶级还是对象?是对象还是类?
在ruby中,类对象实际上是Class类的一个实例. class Foo几乎完全相同Foo = Class.new
MyClass = Class.new
instance = MyClass.new
puts instance # => #<MyClass:0x100c14b38>
Run Code Online (Sandbox Code Playgroud)
此外,该class方法更多的设计是在实例上调用,而不是类对象.
class Foo
end
f = Foo.new
puts f.class # => Foo
Run Code Online (Sandbox Code Playgroud)
调用类对象时语义可能很奇怪.虽然superclass在类对象上可以正常工作.
所以,只要一个一个地解释这些:
>> Bird.class
=> Class
Run Code Online (Sandbox Code Playgroud)
Bird类对象有一个类Class,因为所有类对象都是类的实例Class.
>> Class.class
=> Class
Run Code Online (Sandbox Code Playgroud)
Class是的甚至是一个实例Class.在这种情况下,它实际上是一个循环引用.
>> Class.superclass
=> Module
Run Code Online (Sandbox Code Playgroud)
该Class级实际上是从继承Module.毕竟,类只是一个可以实例化的模块.但是所有非实例功能与模块完全相同.
>> Module.superclass
=> Object
Run Code Online (Sandbox Code Playgroud)
Module继承自Object.就像回到红宝石中的所有东西一样.
>> Object.class
=> Class
Run Code Online (Sandbox Code Playgroud)
同样,所有类对象都是实例Class.
>> Object.superclass
=> nil
Run Code Online (Sandbox Code Playgroud)
所有红宝石一切都始于Object.它是一切的基础类.因此它没有超类.
>> nil.class
=> NilClass
Run Code Online (Sandbox Code Playgroud)
nil实际上是NilClass引擎盖下的一个例子. NilClass定义nil响应的方法.您甚至可以NilClass根据需要添加方法.还有一个TrueClass和一个FalseClass.
>> NilClass.class
=> Class
Run Code Online (Sandbox Code Playgroud)
同样,所有类对象都是实例Class.
>> NilClass.superclass
=> Object
Run Code Online (Sandbox Code Playgroud)
NilClassObject像任何未指定显式超类的类一样继承.