Ruby:“类是一个对象而Object是一个类”

时间:2016-03-17 01:50:52

标签: ruby

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

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

评估为true

但是,它似乎引入了循环依赖:ClassObject的子类,这意味着必须在Object定义之前定义Class。但是,ObjectClass的实例,这意味着必须先定义Class才能定义Object

这怎么可能?

这可能与询问 Class如何Class 的实例有点相关:

(Class.instance_of? Class)

返回true

1 个答案:

答案 0 :(得分:2)

以下是在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首先使用BasicObject作为boot_defclass的后代创建。稍后,它使用Class将其类设置为RBASIC_SET_CLASS

您的推理中的漏洞就在这里:“ObjectClass的一个实例,这意味着必须先定义Class才能定义Object。 “在创建Object之后,没有什么能阻止你将Class的类设置为else { console.log("Enjoy!") }