2010-04-02 17 views
15

यह इतना स्पष्ट नहीं हो सकता है कि answer_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 बुला कि जन्म देती है? साथ 2 तर्क के रूप में अच्छी तरह से

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

सच की जांच निजी विधि करने के लिए सेट और वह कहीं अधिक उचित

है तो सवाल यह है कि अगर वस्तु सार्वजनिक विधि केवल का जवाब की जांच करने के लिए है? क्या इससे कोई समाधान बेहतर है?

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

उत्तर

8

यह बहस के अंतर्गत है अगर respond_to? या नहीं सुरक्षित तरीकों के लिए दिखना चाहिए (जाँच this issue)

Matz ने कहा है कि यह शायद रूबी 2.0 में बदल जाएगा।

नोट कुछ वर्गों #method_missing उपयोग कर सकते हैं और #respond_to? विशेषज्ञ (या बेहतर से रूबी में एक #respond_to_missing? निर्दिष्ट 1.9.2+), जिस स्थिति में अपने obj.methods.include? विश्वसनीय नहीं होगा।

+0

अनुवादित जापानी समझना मेरे लिए मुश्किल है लेकिन वैसे भी यह जानना अच्छा है कि रूबी कोर उस मुद्दे पर विचार करता है। कम से कम एक obj.class.public_method_defined का उपयोग कर सकता है? (: Protect_method) और यह अपेक्षित के रूप में काम करता है लेकिन सिंगलटन विधियों को संभाल नहीं पाएगा, इसलिए मैं मानता हूं कि वर्कअराउंड वास्तविक समाधान नहीं है – mlomnicki

+0

अद्यतन जानकारी के साथ अद्यतन उत्तर –

11

documentation से:

रिटर्न सच अगर obj दिया विधि के लिए प्रतिक्रिया करता है। निजी और संरक्षित तरीकों खोज ही अगर वैकल्पिक दूसरा पैरामीटर सच

जब सवाल लिखा गया था का मूल्यांकन में शामिल किए गए हैं (रूबी 1.8.7):

रिटर्न सच obj अगर दिए गए विधि का जवाब देता है। निजी तरीकों को केवल तभी खोज में शामिल किया जाता है जब वैकल्पिक दूसरा पैरामीटर सत्य पर मूल्यांकन करता है।

+1

प्रश्न 2010 से है । फिर रूबी 1.8.7 में दस्तावेज़ों ने कहा कि: "सत्य वापस आता है> यदि ओबीजे दिए गए विधि का जवाब देता है। निजी विधियों को केवल खोज में शामिल किया जाता है यदि वैकल्पिक दूसरा पैरामीटर सत्य पर मूल्यांकन करता है।" – steenslag

+1

अभी भी एक मूल्यवान उत्तर। रुबी '1.8.7' से रूबी' 2.1.1' तक पुरानी परियोजना को अपग्रेड करते समय मैंने इस जिज्ञासु बग की खोज की। –

+0

यह [ruby-doc.org] पर है (http://ruby-doc.org/core-2.2.1/Object.html#method-i-respond_to-3F) अब। –

संबंधित मुद्दे