2014-05-22 10 views
5

मुझे प्रत्येक ऑब्जेक्ट पर Kernel विधियों को कॉल करने में सक्षम होना चाहिए, और format विधि Kernel पर परिभाषित की जानी चाहिए। method_missing कोपर तीसरा उदाहरण क्यों दिया गया है?कर्नेल विधि केवल तभी देखी जाती है जब 'प्रेषण' का उपयोग किया जाता है?

class A 
    def method_missing(meth, *args, &block) 
    if meth == :foo 
     puts 'ok' 
    elsif meth == :format 
     puts 'ok' 
    end 
    end 
end 

a = A.new 
a.foo   # => ok 
a.send(:foo) # => ok 
a.format  # => ok 
a.send(:format) # => too few arguments (ArgumentError) 

उत्तर

7

ऐसा इसलिए है क्योंकि Kernel#format एक निजी विधि है। जब आप इसे send का उपयोग करके कॉल करते हैं, जिसका अर्थ है कि आप बिना किसी स्पष्ट रिसीवर के इसे कॉल कर रहे हैं, परिभाषित विधि कहा जाता है, और तर्क त्रुटि उठाई जाती है। जब आप इसे एक स्पष्ट रिसीवर के साथ बुलाते हैं, तो विधि नहीं मिलती क्योंकि परिभाषित एक निजी है, और इसलिए method_missing लागू किया जाता है।

+1

इस के लिए स्वीकृत उत्तर बदल गया, क्योंकि यह वास्तव में 'प्रेषण' बनाम प्रत्यक्ष कॉल मेलसमूह बेहतर बताता है। –

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

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