2016-03-17 55 views
1

在表面的水平,这是有意义的:红宝石:“类是一个对象,对象是类”

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

评估为true

然而,似乎引入循环依赖:ClassObject一个子类,这意味着可以定义Class之前Object必须定义。但是,ObjectClass的一个实例,这意味着Class必须在可以定义Object之前定义。

这怎么可能?

这可能是有些涉及到询问如何ClassClass一个实例:

(Class.instance_of? Class) 

回报true

回答

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首先创建为使用boot_defclassBasicObject后裔。之后,它的类别设置为Class,使用RBASIC_SET_CLASS

的闪失,在你的推理是在这里:“ObjectClass一个实例,这意味着可以定义Object之前Class必须定义。”在创建Object的课程后,您无法阻止您设置Class