2011-08-30 56 views
1

對不起,標題很糟糕,但我有點失落。DelegateClass和類似方法在哪個對象/類上存在?

我想弄清楚哪些對象/類生活方法,如DelegateClass和這些類型的方法的術語是什麼。我正在閱讀Metaprogramming Ruby,在這本書中,這些方法通常稱爲模仿方法,但在互聯網上搜索可以得到各種結果,所以我想知道他們是否有更好的名字。

我檢查了DelegateClass的源代碼,我假設它已添加到Object,但它不在那裏。我可以看到類Delegator和SimpleDelegator,它們在同一個rb文件中,增加了作爲常量(儘管我不確定它們是如何被添加的)。

謝謝!

回答

3

剛剛找到答案。這是在對象

ruby-1.9.2-p290 :033 > Object.private_instance_methods(false).grep /Dele/ 
=> [:DelegateClass] 

編輯的私有方法

我發現了什麼,我需要了解是什麼是當前類?在給定的上下文中。

+0

這是正確的答案('選擇'的答案是錯誤的),但使用'方法(:DelegateClass).owner'來驗證,而不是grep;) – horseyguy

0

仔細看看文件。

def DelegateClass(superclass) 
    klass = Class.new(Delegator) 
    ... 

,並使用

method(:DelegateClass).owner 

找到類的地方坐。正如在註釋中提到的,Module上的私有實例方法包含Object上定義的任何東西。

所以不,DelegateClass()是不是一種特殊的方法,除了被稱爲大寫(這使得它看起來像一個常數)。它只是返回一個可以繼承的現場創建的匿名類。

+0

非常感謝Julik!我不知道的非常重要的一點是,腳本中定義的方法被添加到Module中!順便說一下,我在'irb'中定義了一個方法,並將它添加到Module中(不知道它是否適用於pry)。 – Augusto

+2

@Julik:這是不正確的,該方法被定義爲Object中的私有實例方法,無論它是在irb還是pry中定義,還是在ruby腳本中運行,都使用Method#owner來揭示:方法(:DelegateClass).owner => Object'。你的'Module.private_instance_method'返回你得到的結果的原因是因爲'Module'是Object的一個子類。儘管如此,'DelegateClass'是'Object'上的私有實例方法。 – horseyguy

+0

方法#所有者非常整潔的技巧,不知道!謝謝! – Julik

相關問題