2012-07-09 48 views
3

類單方法方法查找我的印象是,obj.method造成紅寶石尋找method正是如此:使用Ruby

  1. 查找範圍obj的單例類。
  2. 查看obj的單例類包含的模塊。
  3. 看看obj的班級。
  4. 照照模塊通過obj的類
  5. 重複,直到發現
  6. 如果沒有找到,打電話method_missing原始對象上,obj在類的超步驟3和4包括在內。

在這種模式下,所述單例類關注的方法是單例類原接收機,obj的。然而,這個模型不能解釋一個事實,即一個子類可以訪問它的超類的單例方法。例如

class Foo 
    def self.foo 
    "foo" 
    end 
end 

class Bar < Foo 
end 

Bar.foo #=> "foo" 

我很困惑,因爲我相信,這意味着Foo的單例類是在一些點搜索的方法foo。但是,在上面的模型中,我預計只有Bar的單身人員課程將被搜索foo。否則,我希望紅寶石看Bar的類,Class,然後繼續爬取超類鏈(完全跳過Foo及其單例類)。

所以我的問題:我對Ruby方法查找的理解中缺少什麼,它解釋了一個類可以訪問其超類的單例方法的事實?

+0

下面的問題有一個詳細的答案,可能也有幫助:http://stackoverflow.com/questions/23848667/ruby-method-lookup-path-for-an-object – Powers 2014-05-25 06:22:47

回答

8

繼承時,不僅是Bar.superclass設置爲Foo,但對單類也是如此:

Bar.singleton_class.superclass == Foo.singleton_class # => true 

所以,你不是真糊塗。實際查找是:

  1. obj的單身類開頭。
  2. 查找實例方法向下祖先列表:
    • 預謀模塊(紅寶石2.0)
    • 類本身
    • 包含的模塊
  3. 重複#2與超類。
  4. 重複#1,但這個時間尋找method_missing
+1

我明白了。我想我一直認爲這個關係是'obj.singleton_class.superclass == obj.class'。感謝您清理這個!也謝謝backports :) – 2012-07-10 00:07:07

+0

這是一個很好的解釋!非常感謝:) – 2013-11-16 06:53:03

3

這是非常簡單的。或者不是,但無論如何:

The metaclass of the superclass is the superclass of the metaclass. 

其中「元類」真的是「單身類」。您的型號中缺少的是Bar.superclass繼承Foo.superclass。平原和簡單:)

+0

我認爲你的句子「你的模型中缺少的是Bar.superclass繼承Foo.superclass」應該改爲「你的模型中缺少的是Bar.singleton_class繼承自Foo.singleton_class」。 – Powers 2014-05-24 18:37:00