Ruby Language
method_missing
खोज…
पैरामीटर
पैरामीटर | विवरण |
---|---|
तरीका | जिस विधि को बुलाया गया है उसका नाम (उपरोक्त उदाहरण में यह है :say_moo , ध्यान दें कि यह एक प्रतीक है। |
* args | इस पद्धति के लिए तर्क पारित हुए। कोई भी संख्या या कोई भी हो सकता है |
&खंड मैथा | कहा जाता विधि के ब्लॉक, यह या तो एक हो सकता है do ब्लॉक, या एक { } संलग्न ब्लॉक |
टिप्पणियों
इस फ़ंक्शन के निचले भाग पर हमेशा सुपर कॉल करें। जब कुछ कहा जाता है तो यह मौन विफलता को बचाता है और आपको कोई त्रुटि नहीं मिलती है।
उदाहरण के लिए, यह method_missing समस्याओं का कारण बनने जा रहा है:
class Animal
def method_missing(method, *args, &block)
say, speak = method.to_s.split("_")
if say == "say"
speak
end
end
end
=> Animal.new.foobar
=> nil # This should really be raising an error
method_missing
उपयुक्त होने पर उपयोग करने के लिए एक अच्छा उपकरण है, लेकिन इसकी दो लागतें हैं जिन पर आपको विचार करना चाहिए। सबसे पहले, method_missing
कम कुशल है - रूबी को इस दृष्टिकोण पर वापस आने से पहले कक्षा और उसके सभी पूर्वजों की खोज करनी चाहिए; यह प्रदर्शन दंड एक साधारण मामले में तुच्छ हो सकता है, लेकिन जोड़ सकता है। दूसरे और अधिक मोटे तौर पर, यह मेटा-प्रोग्रामिंग का एक रूप है जिसमें महान शक्ति है जो यह सुनिश्चित करने के लिए जिम्मेदारी के साथ आती है कि कार्यान्वयन सुरक्षित है, ठीक से दुर्भावनापूर्ण इनपुट, अनपेक्षित इनपुट और इतने पर संभालता है।
आपको respond_to_missing?
को भी ओवरराइड करना चाहिए respond_to_missing?
इस तरह:
class Animal
def respond_to_missing?(method, include_private = false)
method.to_s.start_with?("say_") || super
end
end
=> Animal.new.respond_to?(:say_moo) # => true
एक अपरिभाषित विधि के लिए कॉल पकड़ना
class Animal
def method_missing(method, *args, &block)
"Cannot call #{method} on Animal"
end
end
=> Animal.new.say_moo
> "Cannot call say_moo on Animal"
लापता पद्धति का उपयोग करना
class Animal
def method_missing(method, *args, &block)
say, speak = method.to_s.split("_")
if say == "say"
speak
else
super
end
end
end
=> a = Animal.new
=> a.say_moo
=> "moo"
=> a.shout_moo
=> NoMethodError: undefined method `shout_moo'
ब्लॉक के साथ उपयोग करें
class Animal
def method_missing(method, *args, &block)
if method.to_s == 'say'
block.call
else
super
end
end
end
=> Animal.new.say{ 'moo' }
=> "moo"
पैरामीटर के साथ उपयोग करें
class Animal
def method_missing(method, *args, &block)
say, speak = method.to_s.split("_")
if say == "say" && speak
return speak.upcase if args.first == "shout"
speak
else
super
end
end
end
=> Animal.new.say_moo
=> "moo"
=> Animal.new.say_moo("shout")
=> "MOO"