這是如何計算的?它是圓形Class.superclass = Module,Module.class = Class?
更新: (在IRB)
Class.superclass = Module
Module.class = Class
怎麼可能說,一個模塊的類是類,當類是底層的模塊?這是圓形的,雞肉和雞蛋的東西。
對象:相同的問題:對象是對象模型中的根對象。它的類如何可以是Class,因爲Class對象還不存在?
這是如何計算的?它是圓形Class.superclass = Module,Module.class = Class?
更新: (在IRB)
Class.superclass = Module
Module.class = Class
怎麼可能說,一個模塊的類是類,當類是底層的模塊?這是圓形的,雞肉和雞蛋的東西。
對象:相同的問題:對象是對象模型中的根對象。它的類如何可以是Class,因爲Class對象還不存在?
讓我們來看看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)
注意Object
,Module
和Class
是來自BasicObject
。的確,
irb(main):001:0> BasicObject.superclass
=> nil
這些對象是同時定義的,它們全都有RBASIC(*)->klass = rb_cClass
。
啊哈,所以這個信息我只是引導!謝謝 – Vassilis 2011-04-24 13:23:55
x.superclass
和x.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
本身。
循環依賴關係工作,因爲這些都是內置類。它們是核心Ruby運行時的一部分,在啓動時以這種方式設置,並且不會像通常添加類一樣添加。運行時有權設置指針,但設計者選擇這樣做。
或者就此而言'Object.class = Class'。 ??對象(Ruby OM中的根)的類是Class?但是班級還沒有定義呢? – Vassilis 2011-04-24 01:34:04
這不是一個明確定義的問題,但[圖](http://phrogz.net/RubyLibs/RubyMethodLookupFlow.png)可能會有所幫助。 – Phrogz 2011-04-24 01:38:40
該圖顯示了超類和特徵類。不是什麼類是你的每個對象圖 – Vassilis 2011-04-24 02:30:12