在写下我反复努力理解 ruby 的对象模型之后,我现在很困惑:以下是我的观察。
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 ....
这是怎么回事?祖先 nil 或 NilClass 或 Object 或 Class 的顶点是什么? Ruby 的对象模型是如何组织的。
什么是类,什么是对象? Class 是一个类还是一个对象?对象是对象还是类?
最佳答案
在ruby中,类对象实际上是Class
类的一个实例。 class Foo
几乎等同于 Foo = Class.new
MyClass = Class.new
instance = MyClass.new
puts instance # => #<MyClass:0x100c14b38>
此外,class
方法更适合在实例而不是类对象上调用。
class Foo
end
f = Foo.new
puts f.class # => Foo
调用类对象时语义可能很奇怪。尽管 superclass
可以像您期望的那样在类对象上工作。
鉴于所有这些,让我们一一解释:
>> Bird.class
=> Class
Bird
类对象有一个 Class
类,因为所有类对象都是 Class
类的实例。
>> Class.class
=> Class
是的,甚至 Class
也是 Class
的一个实例。在这种情况下,它实际上是一个循环引用。
>> Class.superclass
=> Module
Class
类实际上继承自Module
。毕竟,类只是一个可以实例化的模块。但是所有非实例功能都与模块完全相同。
>> Module.superclass
=> Object
Module
继承自 Object
。如果你回溯得足够远,就像 ruby 中的所有东西一样。
>> Object.class
=> Class
同样,所有类对象都是 Class
的实例。
>> Object.superclass
=> nil
所有 ruby 一切都以 Object
开头。它是一切的基类。因此它没有父类(super class)。
>> nil.class
=> NilClass
nil
实际上是 NilClass
的一个实例。 NilClass
定义了 nil
响应的方法。如果需要,您甚至可以向 NilClass
添加方法。还有一个 TrueClass
和一个 FalseClass
。
>> NilClass.class
=> Class
同样,所有类对象都是 Class
的实例。
>> NilClass.superclass
=> Object
NilClass
像任何未指定显式父类(super class)的类一样从 Object
继承。
关于ruby - ruby 中类的类型和类的父类(super class)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264233/