2011-04-24 56 views
10

這是如何計算的?它是圓形Class.superclass = Module,Module.class = Class?

更新: (在IRB)

Class.superclass = Module 
Module.class = Class 

怎麼可能說,一個模塊的類是類,當類是底層的模塊?這是圓形的,雞肉和雞蛋的東西。

對象:相同的問題:對象是對象模型中的根對象。它的類如何可以是Class,因爲Class對象還不存在?

+0

或者就此而言'Object.class = Class'。 ??對象(Ruby OM中的根)的類是Class?但是班級還沒有定義呢? – Vassilis 2011-04-24 01:34:04

+0

這不是一個明確定義的問題,但[圖](http://phrogz.net/RubyLibs/RubyMethodLookupFlow.png)可能會有所幫助。 – Phrogz 2011-04-24 01:38:40

+0

該圖顯示了超類和特徵類。不是什麼類是你的每個對象圖 – Vassilis 2011-04-24 02:30:12

回答

10

讓我們來看看class.c文件MRI源代碼:

void Init_class_hierarchy(void) 
{ 
    id_attached = rb_intern("__attached__"); 

    rb_cBasicObject = boot_defclass("BasicObject", 0); 
    /* boot_defclass is defined as boot_defclass(const char *name, VALUE super) */ 
    rb_cObject = boot_defclass("Object", rb_cBasicObject); 
    rb_cModule = boot_defclass("Module", rb_cObject); 
    rb_cClass = boot_defclass("Class", rb_cModule); 

    /* Very important line: */ 
    RBASIC(rb_cClass)->klass 
      = RBASIC(rb_cModule)->klass 
      = RBASIC(rb_cObject)->klass 
      = RBASIC(rb_cBasicObject)->klass 
      = rb_cClass; 
} 

ruby.h這些定義是非常重要的,太:

#define R_CAST(st) (struct st*) 
#define RBASIC(obj) (R_CAST(RBasic)(obj)) 
#define ROBJECT(obj) (R_CAST(RObject)(obj)) 
#define RCLASS(obj) (R_CAST(RClass)(obj)) 
#define RMODULE(obj) RCLASS(obj) 

注意ObjectModuleClass是來自BasicObject。的確,

irb(main):001:0> BasicObject.superclass 
=> nil 

這些對象是同時定義的,它們全都有RBASIC(*)->klass = rb_cClass

+0

啊哈,所以這個信息我只是引導!謝謝 – Vassilis 2011-04-24 13:23:55

3

x.superclassx.class具有不同的語義。注意:

irb(main):003:0> 3.superclass 
NoMethodError: undefined method `superclass' for 3:Fixnum 
    from (irb):3 
    from :0 
irb(main):004:0> 3.class 
=> Fixnum 

3沒有superclass因爲...... 3不是一個類或類似的東西。但是3.class意味着3是一個實例。

所以應該對應於Class.superclass的東西不是Module.class,而是Module本身。

2

循環依賴關係工作,因爲這些都是內置類。它們是核心Ruby運行時的一部分,在啓動時以這種方式設置,並且不會像通常添加類一樣添加。運行時有權設置指針,但設計者選擇這樣做。

相關問題