首先,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
也是它自己的实例)。
Class
是Module
的子类,而Class
本身则是一个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
和Class
的class
指针,使它们都指向Class
,这样就完成了。
从系统外部来看,这很容易实现,但从内部看则会显得很奇怪。
Class
”或者“...该对象的类本身是一个Class
的实例”。 - Jörg W Mittag