निम्नलिखित एक्सटेंशन पर विचार करें (वर्षों में कई रेल प्लगइन्स द्वारा लोकप्रिय पैटर्न):मैक्रो-जैसी मेटाप्रोग्रामिंग विधियों के साथ आप रूबी मॉड्यूल का विस्तार कैसे करते हैं?
module Extension
def self.included(recipient)
recipient.extend ClassMethods
recipient.send :include, InstanceMethods
end
module ClassMethods
def macro_method
puts "Called macro_method within #{self.name}"
end
end
module InstanceMethods
def instance_method
puts "Called instance_method within #{self.object_id}"
end
end
end
यदि आप इसे प्रत्येक वर्ग में बेनकाब करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:
Object.send :include, Extension
अब आप किसी भी वर्ग को परिभाषित कर सकते हैं और मैक्रो विधि का उपयोग कर सकते हैं:
class FooClass
macro_method
end
#=> Called macro_method within FooClass
और उदाहरण उदाहरण विधियों का उपयोग कर सकते हैं:
FooClass.new.instance_method
#=> Called instance_method within 2148182320
लेकिन Module.is_a?(Object)
के बावजूद, आप मॉड्यूल में मैक्रो विधि का उपयोग नहीं कर सकते हैं।
module FooModule
macro_method
end
#=> undefined local variable or method `macro_method' for FooModule:Module (NameError)
यह सच है भले ही आप Module.send(:include, Extension)
के साथ Module
में मूल Extension
स्पष्ट रूप से शामिल करें।
व्यक्तिगत मॉड्यूल के लिए आप हाथ से एक्सटेंशन शामिल कर सकते हैं और एक ही प्रभाव प्राप्त कर सकते हैं:
module FooModule
include Extension
macro_method
end
#=> Called macro_method within FooModule
लेकिन आप सभी रूबी मॉड्यूल में मैक्रो-जैसी विधियों को कैसे जोड़ते हैं?
* * वह ब्लॉग पोस्ट है। मुझे पता था कि मैंने इसे हाल ही में देखा होगा। अभी भी उत्सुक है कि दूसरी रणनीति क्यों काम नहीं करती है, और मुझे विश्वास नहीं है कि यह एक मामूली दोष के रूप में एक गंभीर विरोधी पैटर्न है, लेकिन मैं सहमत हूं कि मूल रूप से "ओवरराइडिंग में कोई बात नहीं है, जब विस्तार की तरह व्यवहार करना शामिल है रूबी दोनों प्रदान करता है। " "कार्गो-पंथ" के लिए –
+1। –
क्या आपने "macro_method" को परिभाषित करने का कोई तरीका है, लेकिन यह चुनने में सक्षम है कि किन वर्गों तक इसका उपयोग है? –