2010-05-18 74 views
5

我一直在閱讀Metaprogramming Ruby,對象模型就像雞或雞蛋的困境。Ruby的對象模型是什麼?

在Ruby 1.8中,Object類是Class的一個實例。 Module的超類是Object,它是Class的一個實例。 Class'超類是Module,它是Class(自引用)的一個實例。說班級SomeClass;結尾定義在某處; SomeClass是Class的一個實例,但它的超類是Object。爲什麼Class的一個實例將Object作爲超類而不是nil?另外,如果Object存在,那麼Class必須存在,但是Module必須存在,但是Module存在Object必須存在。這些類是如何創建的?

回答

5

下面是一個完整的Ruby類圖(爲Ruby 1.8):http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

爲了幫助你理解類圖是知道類指針和超類指針有用的怪看似不可能自我反省的性質可以隨時在C API中分配。也就是說,您可以創建一個對象(在C API中)並且事後決定Class和Super類指針指向什麼。

此外,瞭解定義的順序,看Init_Object()object.c(Ruby 1.9中)

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); 

metaclass = rb_make_metaclass(rb_cBasicObject, rb_cClass); 
metaclass = rb_make_metaclass(rb_cObject, metaclass); 
metaclass = rb_make_metaclass(rb_cModule, metaclass); 
metaclass = rb_make_metaclass(rb_cClass, metaclass); 
boot_defmetametaclass(rb_cModule, metaclass); 
boot_defmetametaclass(rb_cObject, metaclass); 
boot_defmetametaclass(rb_cBasicObject, metaclass); 

rb_cBasicObject是紅寶石BasicObjectrb_cObject是紅寶石Object,等等。

1

要考慮的最簡單的事情是,一切都在紅寶石是一個對象。其他一切都是對這個概念的修改。所以類類通過修改Object來添加類的功能。因此每個對象都是一個類,等等。

Object的超類爲零。 (Reference

Object的超類是BasicObject(在1.9中),而BasicObject的超類是nil。

+0

好了,對象是首次創建(1.8),然後在以後修改,使得對象#類是類? – Timothy 2010-05-18 18:48:10

相關問題