मुझे लगता है कि सबसे अच्छा तरीका है मिक्सिन्स वर्चुअल क्लास के रूप में। मिक्सिन "वर्चुअल क्लास" हैं जिन्हें एक क्लास या मॉड्यूल की पूर्वज श्रृंखला में इंजेक्ट किया गया है।
जब हम "शामिल" का उपयोग करते हैं और इसे एक मॉड्यूल पास करते हैं, तो यह मॉड्यूल को पूर्वजों की श्रृंखला में उस वर्ग से ठीक पहले जोड़ता है, जिसे हम निम्नलिखित हैं:
class Parent
end
module M
end
class Child < Parent
include M
end
Child.ancestors
=> [Child, M, Parent, Object ...
रूबी की हर वस्तु में एक एकल वर्ग भी होता है। इस एकल वर्ग में जोड़े गए तरीकों को सीधे ऑब्जेक्ट पर बुलाया जा सकता है और इसलिए वे "क्लास" विधियों के रूप में कार्य करते हैं। जब हम किसी ऑब्जेक्ट पर "विस्तार" का उपयोग करते हैं और ऑब्जेक्ट को एक मॉड्यूल पास करते हैं, तो हम मॉड्यूल के तरीकों को ऑब्जेक्ट के सिंगलटन वर्ग में जोड़ रहे हैं:
module M
def m
puts 'm'
end
end
class Test
end
Test.extend M
Test.m
हम सिंगलटन क्लास को सिंगलटन क्लास के साथ एक्सेस कर सकते हैं:
Test.singleton_class.ancestors
=> [#<Class:Test>, M, #<Class:Object>, ...
रूबी मॉड्यूल के लिए कुछ हुक प्रदान करता है जब उन्हें कक्षाओं / मॉड्यूल में मिलाया जाता है। included
रूबी द्वारा प्रदान की जाने वाली एक हुक विधि है जिसे तब भी कहा जाता है जब आप किसी मॉड्यूल या कक्षा में एक मॉड्यूल शामिल करते हैं। शामिल की तरह, extended
विस्तार के लिए एक जुड़ा हुआ हुक है। यह तब कहा जाएगा जब एक मॉड्यूल दूसरे मॉड्यूल या वर्ग द्वारा बढ़ाया जाता है।
module M
def self.included(target)
puts "included into #{target}"
end
def self.extended(target)
puts "extended into #{target}"
end
end
class MyClass
include M
end
class MyClass2
extend M
end
यह एक दिलचस्प पैटर्न बनाता है जिसे डेवलपर्स उपयोग कर सकते हैं:
module M
def self.included(target)
target.send(:include, InstanceMethods)
target.extend ClassMethods
target.class_eval do
a_class_method
end
end
module InstanceMethods
def an_instance_method
end
end
module ClassMethods
def a_class_method
puts "a_class_method called"
end
end
end
class MyClass
include M
# a_class_method called
end
जैसा कि आप देख सकते हैं, यह एकल मॉड्यूल उदाहरण विधियों, "वर्ग" विधियों को जोड़ रहा है, और लक्ष्य वर्ग पर सीधे कार्य कर रहा है (इस मामले में a_class_method () को कॉल कर रहा है)।
ActiveSupport :: चिंता इस पैटर्न encapsulates। ActiveSupport का उपयोग करने के लिए यहां एक ही मॉड्यूल फिर से लिखा गया है :: चिंता:
module M
extend ActiveSupport::Concern
included do
a_class_method
end
def an_instance_method
end
module ClassMethods
def a_class_method
puts "a_class_method called"
end
end
end