Ruby的物件模型

2021-09-23 16:52:04 字數 2483 閱讀 2294

ruby的物件模型,包含在下面這張圖中:

首先要知道,ruby中的類也是物件,類相比於其他物件特殊的地方在於能夠產生物件,既然類是物件,那麼它顯然也有類,也就是所謂類的類,這個類的類在ruby中就是類的metaclass,圖中的(otherclass),(otherclass)就是類otherclass的klass(c層次),(otherclass)儲存了類的方法(類方法)和類的例項變數,並且是唯一的且不可例項化。在ruby層次上我們想操作(otherclass)應該類似:

class

otherclass

endclass

<<

otherclass

attr_accessor:name 

#name是otherclass的例項變數

deftestp '

hello

'end

endotherclass.name='

1'p otherclass.name

otherclass.test

圖中的instance是otherclass的乙個例項,那麼顯然instance的class是otherclass,可是圖中的(instance)又是什麼呢?(instance)就是物件的singleton類,singleton類這個名稱怪怪的,不過每個物件只能有乙個singleton類的角度上說也可以理解。看看下面的例子:

class

otherclass

endinstance

=otherclass.new

class

<<

instance

deftestp "

a.test

"end

attr_accessor:name

endinstance.test

instance.name="

dennis

"p instance.name

instance通過otherclass.new建立,但是此時(instance)還不存在,這與(otherclass)情況不同,每個類一經建立就有乙個metaclass,而物件就不一樣,只有當你通過class

82 }

83 return cl;

84 }

(object.c)

核心**就是:

while (fl_test(cl, fl_singleton) || type(cl) == t_iclass)

其中fl_test(cl,fl_singleton)用於測試是否是singleton類,而type(cl)==tl_iclass是否是包含模組的**類,tl_iclass的i就是include的意思。

圖中類otherclass繼承object,這個是顯而易見的,不再多說。而object、class和module這三個類是沒辦法通過api建立的,稱為元類,他們的之間的關係如圖所示,object的class是class,module繼承object,而class又繼承module,因此class.kind_of? object返回true,這個問題類似先有雞,還是先有蛋的問題,是先有object?還是先有class?而c ruby的解決辦法是不管誰先有,建立object開始,接著建立module和class,然後分別建立它們的metaclass,從此整個ruby的物件模型開始運轉。

1243 rb_cobject = boot_defclass("object", 0);

1244 rb_cmodule = boot_defclass("module", rb_cobject);

1245 rb_cclass = boot_defclass("class", rb_cmodule);

1246

1247 metaclass = rb_make_metaclass(rb_cobject, rb_cclass);

1248 metaclass = rb_make_metaclass(rb_cmodule, metaclass);

1249 metaclass = rb_make_metaclass(rb_cclass, metaclass);

(object.c)

那麼當我們呼叫class.class發生了什麼?class的klass其實指向的是(class),可根據上面的**,我們知道會忽略這個(class),繼續往上找就是(module),同理找到(object),而(object)繼承自class,顯然class的類仍然是class,class的類的類也是class,多麼有趣。同理,object.class和module.class都將是class類。

再來看看include模組時發生的故事。include模組的過程如下圖所示:

include模組,本質上是在物件或者類的klass和super之間插入了乙個**類iclass,這個**類的方法表(m_table)和變數表(iv_table)分別指向了被包含的模組的方法表和變數表(通過指標,因此當包含的module變化的時候,物件或者類也能相應變化),那麼在查詢類或者物件的class的時候,上面已經說明將忽略這些**類。

文章**莊周夢蝶  ,原文發布時間2007-09-29

Ruby物件導向

ruby是真正的物件導向語言,一切皆為物件,甚至基本資料型別都是物件 class box 建構函式 def initialize w,h with,height w,h 加 的是例項變數 end get方法 def getwidth with 預設最後一條語句的返回值作為函式返回值 enddef g...

Ruby中的物件導向

物件導向是ruby的核心思想,我先列舉幾個單詞然後來解釋他們各自的意思。class state,method,instance,object,constructor,new,id,instance,variables,message class是生產類的母體,而constructor是生產類的機器。...

ruby 過程物件 解析

我們總是希望對未知事件分類.當它發生時,向其它方法傳遞一塊作為引數的程式碼是最容易地解決方法,也就是說我們希望像處理資料一樣處理程式碼.乙個新的過程物件可以通過proc建立 ruby quux proc 現在quux指向乙個物件,像其它物件一樣,它也有可以呼叫的行為.特別的,我們可以用call方法執...