2016-03-17 57 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