2014-06-13 19 views
6

當使用紅寶石method_missing,這是almost always a good idea定義respond_to_missing?爲好。「respond_to_missing?」的第二個參數對任何事情都有用嗎?

respond_to_missing?有兩個參數;我們正在檢查的方法的名稱(symbol),以及一個布爾值,表示我們是否應該在我們的支票中包含私人方法(include_all)。

現在這就是我很困惑:method_missing不接受任何可能表明它是否應該調用私人方法的參數,如respond_to_missing?所做的那樣。此外,無論原始方法調用是處於公共還是私有環境中,並且無論在適當的上下文中爲給定方法返回什麼,method_missing都會被調用。因此,所有method_missing的操作都可以公開訪問。

如果是這樣,那麼respond_to_missing?include_all)的第二個參數有什麼作用?無論是給定的對象響應缺少方法不能通過在缺少方法被調用的情況下受到影響,那爲什麼還要有這個說法呢?

回答

3

我認爲respond_to_missing?有第二個參數,這與respond_to?的作用相同。在這兩種情況下,它都允許代碼通過尊重方法隱私的方式向對象詢問它響應的方法。如果使用得當,它可以幫助你更好地封裝你的對象。

您已指出method_missing中缺少的功能,即它應該有一個參數說明方法是在公共還是私人環境中調用的。也許method_missing有一天會有這個功能。在此之前,也就是通過method_missing實施對象的所有功能將有效地是公開的,但你仍然可以阻止人們從你的文檔中,並通過respond_to_missing?使用它。

+1

嗯...所以你說,即使目前沒有辦法使缺少的方法變爲私人,你可以使用'respond_to_missing?'來部分模仿這種行爲,不要宣傳你可能存在的缺失方法想成爲私人? – Ajedi32

+0

是的,沒錯。 –

0

的method_missing不採取這可能表明它 任何參數是否應該調用私有方法或不

method_missing的()不叫公共或私有方法。當找不到方法時,method_missing()在方法查找路徑的最後被調用。所以比較method_missing()和respond_to *是非感性的。你爲什麼認爲他們必須以同樣的方式運作? respond_to?()從來沒有與method_missing()首先對稱。

+0

「method_missing()不調用公共或私有方法」好吧,它可以。我的觀點是缺少的方法可以用來模擬實際上不存在的「方法」的存在。這些「方法」**必須是公開的,因爲「method_missing」不知道公開/私有上下文中缺少「方法」的情況。因此,由於所有缺少的「方法」都是公開的,爲什麼「respond_to_missing」具有第二個參數,允許它返回不同的值,這取決於我們是在尋找「private」還是「public」方法「? – Ajedi32

+0

注意引號:當我說「方法」時,我的意思是'method_missing'模擬存在的不存在的方法。 – Ajedi32

相關問題