मैं अटक गया हूँ। मैं गतिशील रूप से कक्षा विधि को परिभाषित करने की कोशिश कर रहा हूं और मैं अपने सिर को रूबी मेटाक्लास मॉडल के चारों ओर लपेट नहीं सकता। निम्नलिखित वर्ग पर विचार करें:रूबी मेटाक्लास पागलपन
class Example
def self.meta; (class << self; self; end); end
def self.class_instance; self; end
end
Example.class_instance.class # => Class
Example.meta.class # => Class
Example.class_instance == Example # => true
Example.class_instance == Example.meta # => false
स्पष्ट रूप से दोनों विधियां कक्षा का एक उदाहरण लौटाती हैं। लेकिन इन दो उदाहरण समान नहीं हैं। उनके पास अलग-अलग पूर्वजों भी हैं:
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
मेटाक्लास और कक्षा के उदाहरण के बीच अंतर बनाने में क्या बात है?
मुझे पता चला कि मैं send :define_method
को गतिशील रूप से एक विधि को परिभाषित करने के लिए मेटाक्लास पर कर सकता हूं, लेकिन यदि मैं इसे कक्षा के उदाहरण में भेजने की कोशिश करता हूं तो यह काम नहीं करेगा। कम से कम मैं अपनी समस्या का समाधान कर सकता हूं, लेकिन मैं अभी भी समझना चाहता हूं कि यह इस तरह क्यों काम कर रहा है।
अद्यतन मार्च 15, 2010 13:40
निम्नलिखित अनुमान सही हैं।
- यदि मेरे पास एक इंस्टेंस विधि है जो self.instance_eval को कॉल करती है और एक विधि को परिभाषित करती है, तो यह केवल उस वर्ग के विशेष उदाहरण को प्रभावित करेगी।
- यदि मेरे पास एक उदाहरण विधि है जो self.class.instance_eval (जो क्लास_वेल को कॉल करने के समान ही होगी) को कॉल करती है और एक विधि को परिभाषित करती है तो यह उस विशेष वर्ग के सभी उदाहरणों को प्रभावित करेगी जिसके परिणामस्वरूप एक नई इंस्टेंस विधि होगी।
- यदि मेरे पास एक क्लास विधि है जो example_eval को कॉल करती है और एक विधि को परिभाषित करती है तो इसके परिणामस्वरूप सभी उदाहरणों के लिए एक नई इंस्टेंस विधि होगी।
- यदि मेरे पास एक क्लास विधि है जो मेटा/ईजिन क्लास पर instance_eval को कॉल करती है और एक विधि को परिभाषित करती है तो इसका परिणाम क्लास विधि होगा।
मुझे लगता है कि यह मुझे समझ में आता है। यह निश्चित रूप से आपकी संभावनाओं को सीमित करेगा यदि एक वर्ग विधि के भीतर स्वयं ईजिन वर्ग को इंगित करेगा। यदि ऐसा है तो कक्षा विधि के अंदर से एक उदाहरण विधि को परिभाषित करना संभव नहीं होगा। क्या वो सही है?
'example_eval' के अंदर _why_' 'def' के बारे में और जानकारी के लिए कक्षा विधियों को परिभाषित करता है, यह आलेख देखें http://yugui.jp/articles/846 – horseyguy
बहुत बहुत धन्यवाद। मैं अपना प्रश्न अपडेट करता हूं। क्या आप इसे देखने पर ध्यान देंगे? – t6d
आपके अपडेट में सवालों के जवाब देने के लिए अपडेट किया गया। – khelll