खोज…


पैरामीटर

पैरामीटर विवरण
तरीका जिस विधि को बुलाया गया है उसका नाम (उपरोक्त उदाहरण में यह है :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" 


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow