यहाँ के लिए स्रोत है cattr_accessor
तथा
यहाँ के लिए स्रोत है mattr_accessor
जैसा कि आप देख सकते हैं, वे बहुत अधिक समान हैं।
क्यों दो अलग-अलग संस्करण हैं? कभी-कभी आप cattr_accessor
एक मॉड्यूल में लिखना चाहते हैं , इसलिए आप इसका उपयोग अवधी उल्लेखों जैसी कॉन्फ़िगरेशन जानकारी के लिए कर सकते हैं ।
हालांकि, cattr_accessor
एक मॉड्यूल में काम नहीं करता है, इसलिए उन्होंने कम या ज्यादा कोड को मॉड्यूल के लिए भी काम करने के लिए कॉपी किया है।
इसके अतिरिक्त, कभी-कभी आप किसी मॉड्यूल में एक वर्ग विधि लिखना चाहते हैं, जैसे कि जब भी किसी भी वर्ग में मॉड्यूल शामिल होता है, तो वह उस क्लास पद्धति के साथ-साथ सभी इंस्टेंस विधियों को भी प्राप्त करता है। mattr_accessor
आपको यह करने देता है।
हालांकि, दूसरे परिदृश्य में, यह व्यवहार बहुत अजीब है। निम्नलिखित कोड को ध्यान से देखें, विशेष रूप से @@mattr_in_module
बिट्स पर ध्यान दें
module MyModule
mattr_accessor :mattr_in_module
end
class MyClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # directly access the class variable
end
MyModule.mattr_in_module = 'foo' # set it on the module
=> "foo"
MyClass.get_mattr # get it out of the class
=> "foo"
class SecondClass
include MyModule
def self.get_mattr; @@mattr_in_module; end # again directly access the class variable in a different class
end
SecondClass.get_mattr # get it out of the OTHER class
=> "foo"
mattr_accessor
कक्षा के उदाहरण चर (चरों@variable
) के लिए कम होंगे , लेकिन स्रोत कोड से पता चलता है कि वे वास्तव में कक्षा चर की स्थापना / रीडिंग कर रहे हैं। क्या आप इस अंतर को समझा सकते हैं?