首先,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 本身的一个实例)
-
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's、Object's、Module's 和Class's class 指向Class 的指针,我们就完成了。
这在系统外部很容易做到,只是从内部看起来很奇怪。