我不太了解Ruby对象模型。首先,Ruby中的一切是Class
的实例吗?这些都是真的:
p Object.instance_of?(Class)
p Class.instance_of?(Class)
p Module.instance_of?(Class)
p BasicObject.instance_of?(Class)
class Hello; end
p Hello.instance_of?(Class)
如果Object
是Class
的超类,我怎么能理解它是怎么可能的呢?它怎么可能都是Class
的超类和它的一个实例同时(Ruby对象模型上的大多数图表清楚地说明了这个层次结构)?这允许像这样的疯狂:
p BasicObject.is_a?(Object) #=> true
其中BasicObject.class
为Class
,Class.is_a?(Object)
。
顺便说一下,使用Ruby 2.0。
答案 0 :(得分:12)
首先,Ruby中的一切是
Class
的实例吗?
不,并非所有内容都是Class
的实例。只有类是Class
的实例。
很多事情都不是Class
的实例:例如,字符串是String
的实例,而不是Class
的实例。数组是Array
的实例,整数是Integer
的实例,浮点数是Float
的实例,true
是TrueClass
的实例,false
是FalseClass
的实例,nil
是NilClass
的实例,依此类推。
每个类都是Class
的实例,就像每个字符串都是String
的实例一样。
如果
Object
是Class
的超类,它怎么能同时成为Class
的超类和它的实例(Ruby对象模型上的大多数图表清楚说明这个层次结构)?
魔术。
就像大多数其他语言一样,有一些核心实体被假设存在。它们从天而降,凭空出现,神奇地出现。
在Ruby中,其中一些神奇的东西是:
Object
没有超类,但是你不能定义没有超类的类,隐式直接超类总是Object
。 [注意:可能存在Object
的实现定义的超类,但最终会有一个没有超类的超类。] Object
是Class
的一个实例,它是Object
的子类(这意味着间接Object
是Object
本身的实例)< / LI>
Class
是Module
的子类,是Class
Class
是Class
这些都不能用Ruby解释。
BasicObject
,Object
,Module
和Class
都需要同时存在,因为它们具有循环依赖关系。
仅仅因为这种关系不能用Ruby代码表达,并不意味着Ruby语言规范不能说它必须如此。由实现者决定如何做到这一点。毕竟,Ruby实现具有对程序员不具备的对象的访问级别。
例如,Ruby实现可以首先创建BasicObject
,将其superclass
指针及其class
指针设置为null
。
然后,它会创建Object
,将superclass
指针设置为BasicObject
,将class
指针设置为null
。
接下来,它会创建Module
,将superclass
指针设置为Object
,将class
指针设置为null
。
最后,它会创建Class
,将superclass
指针设置为Module
,将class
指针设置为null
。
现在,我们可以覆盖BasicObject
,Object
,Module
&{39}和Class
&#39 ; s class
指针指向Class
,我们已完成。
这很容易从系统外部进行,从内部看起来很奇怪。
答案 1 :(得分:2)
你应该注意到:
p BasicObject.instance_of?(BasicObject)
打印false
。
也就是说,表达式BasicObject
不是BasicObject
的实例,它是其他东西的实例,也就是说,它是一个Class
对象,它代表一个对象,保存(例如)类方法,例如new
。
例如:
p (BasicObject.new()).instance_of?(BasicObject)
打印true
和
p (BasicObject.new()).instance_of?(Class)
打印false
。
答案 2 :(得分:0)
您的所有示例都是按定义类别。类也是对象。但你没做的就是看一个班级的实例:
p Object.new.class
p Hello.new.class
类定义对象的形式,根据定义,类是一个类。但是当您将类实例化为对象时,该对象是新类型。但是你仍然可以看到对象的类本身就是Class:
p Hello.new.class.class