红宝石:"Class is an object and Object is a class"



在表面上,这是有道理的:

(Class.is_a? Object) && (Object.is_a? Class)

评估为 true .

然而,它似乎引入了一个循环依赖关系:ClassObject的子类,这意味着必须先定义Object,然后才能定义Class。然而,ObjectClass的实例,这意味着必须先定义Class,然后才能定义Object

这怎么可能?

这可能与询问Class如何是Class实例有关:

(Class.instance_of? Class)

返回true

以下是在Ruby MRI中实现的答案:

Init_class_hierarchy(void)
{
    rb_cBasicObject = boot_defclass("BasicObject", 0);
    rb_cObject = boot_defclass("Object", rb_cBasicObject);
    rb_cModule = boot_defclass("Module", rb_cObject);
    rb_cClass =  boot_defclass("Class",  rb_cModule);
    rb_const_set(rb_cObject, rb_intern_const("BasicObject"), rb_cBasicObject);
    RBASIC_SET_CLASS(rb_cClass, rb_cClass);
    RBASIC_SET_CLASS(rb_cModule, rb_cClass);
    RBASIC_SET_CLASS(rb_cObject, rb_cClass);
    RBASIC_SET_CLASS(rb_cBasicObject, rb_cClass);
}

Object首先是使用 boot_defclass 作为BasicObject的后代创建的。稍后,它将其类设置为使用 RBASIC_SET_CLASS Class

你的推理中的失误在这里:"ObjectClass的一个实例,这意味着必须先定义Class,然后才能定义Object。没有什么可以阻止您将 Object 的类设置为Class 创建它们之后。

最新更新