天天看點

Advanced Rails -- Ruby 基本技術(2) -- Ruby 基礎1

[b]Ruby 基礎[/b]

[i]類和方法[/i]

類和方法是Ruby裡面向對象的基礎。類便利了關系的包裝和分解。子產品可以用來做mixins—用一替代多繼承來把一堆功能添加到類裡面已增加類的行為。子產品的另一個作用就是把類分到命名空間(namespace) 裡。

在Ruby裡,類的名字是一個常量。這就是為什麼Ruby要求類的名字必須以大寫字母開頭的原因。這些常量會記值在類的對象裡,這個對象就是類Class的一個對象。這個和Class對象是不同的,Class是一個類。“class object”表示一個類。“Class object”是一個類,名字是Class,它是所有類對象的superclass。

類Class繼承與Module,所有的類是以也是一個子產品。但是Classes不能做mixins,也不能擴充一個對象。

[i]方法的查找[/i]

每一Ruby的對象(除了Fixnums,symbols,true,false,nil)都有下面這些字段的集合:

klass

指向這個對象的類對象

iv_tbl

是儲存這個對象執行個體變量的Hash表

flags

狀态資訊

m_tbl

方法表

super

指向父類的指針

[i]規則[/i]

1. Ruby跟随接受者kclass的指針,搜尋這個類m_tbl

2. 如果沒有找到,Ruby跟蹤類對象的super的指針,繼續搜尋m_tbl

3. Ruby用這種方式查找直到找到這個方法或者到了類鍊的頂部

4. 如果沒有找到,Ruby在最初接受者調用method_missing。然後用同樣的方法開始查找method_missing。

單類

單類也被稱為元類,它允許一個對象的行為差別于同一個類的其他對象

單類會被标示為一個虛拟類,這個類在Ruby裡一般看不到,除非特意去做。當通路objA的類的時候,會利用klass和super指針一層一層的去查找,直到找到第一個非虛類。這也說明了,一個對象的klass不一定指向它的類對象。

[i]Singleton classes of class objects[/i]

方法查找最基本的規則就是Ruby根據一個對象的klass指針搜尋方法;然後Ruby在跟尋super指針一級一級的向上查找方法直到繼承鍊的最頂端。

類也是對象。類也可以有單類(越來越難說明白了,呵呵,直接copy code了)

class method(類方法)定義的方式:

這也講述了在一個單類的定義裡——和其他類的定義——self表示的是這個定義類對象。

方法丢失

總結一下,method_missing非常的簡單。當整個方法查找的過程失敗後, 就會用同樣的方法查找method_missing。當method_missing找到後,它會用和最初的方法同樣的參數,并且在前面加上自出的方法名以調用。任何的代碼塊都會通過。

預設的method_missing函數在Object(rb_method_missing) 觸發一個異常。