2010-04-02 90 views
15

response_to可能並不那麼明顯?以紅寶石工作。 考慮以下因素:respond_to?和受保護的方法


class A 

    def public_method 
    end 

    protected 
    def protected_method 
    end 

    private 
    def private_method 
    end 

end 

obj = A.new 
obj.respond_to?(:public_method) 
# true - that's pretty obvious 
obj.respond_to?(:private_method) 
# false - as expected 
obj.respond_to?(:protected_method) 
# true - WTF? 

所以,如果 'OBJ' 響應protected_method我們應該期待

obj.protected_method 

沒有引發異常,不是嗎?

...但它明顯提高

調用respond_to的文檔點?與第二個參數設置爲true檢查私有方法以及

obj.respond_to?(:private_method, true) 
# true 

而這更爲合理

所以,問題是如何檢查對象只響應公衆的方法? 有沒有比這更好的解決方案?

obj.methods.include?(:public_method) 
# true 
obj.methods.include?(:protected_method) 
# false 

回答

8

它正在辯論是否應該respond_to?尋求保護的方法或沒有(檢查this issue

馬茨曾表示,它可能會在Ruby中2.0改變。

注意一些類可能使用#method_missing和專業#respond_to?(通過或更好指定在Ruby #respond_to_missing? 1.9.2+),在這種情況下,您obj.methods.include?將不可靠。

+0

我很難理解翻譯日語,但無論如何,很高興知道紅寶石核心考慮這個問題。至少有一個可以使用obj.class.public_method_defined?(:protected_method),它的工作方式與預期的一樣,但不會處理單例方法,所以我認爲這是一種解決方法,而不是真正的解決方案 – mlomnicki 2010-04-03 01:24:13

+0

回答更新信息 – 2011-11-24 21:55:10

11

documentation:如果obj響應給定的方法

返回true。私人和 保護的方法都包含在僅當可選 第二個參數的計算結果爲真

當問題被寫入搜索(紅寶石1.8.7):

返回true如果obj迴應給定的方法。只有當可選的第二個參數的計算結果爲true時,私有方法纔會包含在搜索中。

+1

問題是從2010 。然後在Ruby 1.8.7中,文檔聲明:「如果obj響應給定的方法,則返回true」。只有當可選的第二個參數的計算結果爲true時,私有方法纔會包含在搜索中。 – steenslag 2014-06-25 15:48:36

+1

仍然是一個有價值的答案。當從Ruby'1.8.7'升級到Ruby' 2.1.1'時,我發現了這個奇怪的bug。 – 2014-08-12 23:41:39

+0

現在它在[ruby-doc.org](http://ruby-doc.org/core-2.2.1/Object.html#method-i-respond_to-3F)上。 – 2015-03-25 12:41:47