में method_missing युक्त मॉड्यूल मैं मॉड्यूल है कि विधि लापता विस्तार की एक जोड़ी है। इसी तरह, ObjectB.new.goodbye_xxx
आउटपुट "Goodbye, xxx"
। respond_to?
भी काम करता है, उदाहरण के लिए ObjectA.new.respond_to? :hello_there
सत्य लौटें।कैसे रचना के लिए गहरे लाल रंग का
बहरहाल, यह बहुत अच्छी तरह से जब आप दोनों SaysHello
और SaysGoodbye
उपयोग करना चाहते हैं काम नहीं करता: सही ढंग से
class ObjectC
include SaysHello
include SaysGoodbye
end
ObjectC.new.goodbye_aaa
जबकि काम करता है, ObjectC.new.hello_a
अजीब कार्य करता है:
> ObjectC.new.hello_aaa
Hello, hello_aaa
NoMethodError: private method `method_missing' called for nil:NilClass
from test.rb:22:in `method_missing' (line 22 was the super.method_missing line in the SaysGoodbye module)
यह सही ढंग से आउटपुट, फिर एक त्रुटि फेंकता है। respond_to?
सही नहीं है, ObjectC.new.respond_to? :hello_a
झूठा देता है।
अंत में, इस वर्ग को जोड़ने:
class ObjectD
include SaysHello
include SaysGoodbye
def respond_to?(method)
super.respond_to?(method) || !!(method.to_s =~ /^lol/)
end
def method_missing(method, *args, &block)
if (method.to_s =~ /^lol/)
puts "Haha, #{method}"
else
super.method_missing(method, *args, &block)
end
end
end
भी अजीब कार्य करता है। ObjectD.new.lol_zzz
काम करता है, हालांकि ObjectD.new.hello_a and ObjectD.new.goodbye_t
दोनों सही स्ट्रिंग आउटपुट के बाद नाम अपवाद फेंक देते हैं। respond_to?
भी हैलो और अलविदा विधियों के लिए विफल रहता है।
क्या यह सब ठीक से काम करने का कोई तरीका है? method_missing
, मॉड्यूल और super
कैसे बातचीत कर रहे हैं इसका एक स्पष्टीकरण भी वास्तव में उपयोगी होगा।
संपादित करें: कोरयवर्ड ने समस्या को हल किया है, अगर मैं परिभाषित सभी विधियों में super.<method-name>(args...)
के बजाय सुपर का उपयोग करता हूं, तो प्रोग्राम सही तरीके से काम करता है। मुझे समझ में नहीं आता कि यह क्यों है, इसलिए मैंने What does super.<method-name> do in ruby?
शामिल मॉड्यूल विरासत श्रृंखला के लिए जोड़ रहे; वे विधियों को ओवरराइड या प्रतिस्थापित नहीं करते हैं। तो यदि प्रत्येक method_missing सुपर कॉल करता है, तो अंत में वे सभी को बुलाया जाएगा। नीचे मेरा जवाब देखें। – ChrisPhoenix