मैं पढ़ रहा था कि रूबी दुभाषिया कैसे कार्यान्वित किया जाता है, और एक सवाल हुआ कि अभी तक मेरे लिए कोई जवाब नहीं मिला। शीर्षक में यह एक है: चूंकि Class
(r_cClass
) super
है (मेटाग्लास को अनदेखा कर रहा है, वास्तव में super
r_cClass
का मेटाक्लास है), अगर मैं Class
ऑब्जेक्ट को एक विधि भेजता हूं, तो यह विधि तालिका में देखा जाएगा Class
'कक्षा। लेकिन Class
'वर्ग Class
है, तो क्या मुझे Class
के उदाहरण विधियों को देखना नहीं चाहिए? लेकिन दस्तावेज Class
कक्षा विधियों और Class
उदाहरण विधियों को अलग करने के बाद से ऐसा नहीं है। रूबी के eval.c
में search_method
में, मुझे Class
कक्षा के लिए कोई विशेष जांच नहीं मिली। क्या कोई इस पर रोशनी डाल सकता है?क्लास कक्षा का वर्ग कैसे हो सकता है और क्लास इंस्टेंस विधियों के पास नहीं हो सकता है?
उत्तर
आपके विश्वासों के तरीके के बारे में आपकी मान्यताओं को सही लगता है, लेकिन मुझे यकीन नहीं है कि आपको ऐसा क्यों लगता है कि यह इस तरह से काम नहीं करता है।
रूबी 1.8.7 में:
irb> a = Class.new.methods - Object.new.methods
=> [... 36 element array ...]
irb> b = Class.methods - Object.new.methods
=> [... 37 element array ...]
irb> b - a
=> ["nesting"]
एक सामान्य वर्ग उदाहरण (Class.new) 36 उदाहरण के तरीकों है। यदि मैं कक्षा को स्वयं देखता हूं, जो एक सामान्य वर्ग उदाहरण भी है, तो इसमें 36 उदाहरण विधियां हैं, साथ ही 1 अतिरिक्त कक्षा विधि (घोंसले), जो केवल इसलिए मौजूद है क्योंकि इसे अपने सुपरक्लास मॉड्यूल से विरासत में मिला है।
ध्यान दें कि कक्षा में एक इंस्टेंस विधि जोड़ना स्वचालित रूप से इसे क्लास विधि के रूप में भी जोड़ता है, लेकिन क्लास के मेटाक्लास में कक्षा जोड़ना नहीं होगा।
irb> class Class ; def everywhere ; true ; end ; end
irb> class << Class ; def only_singleton ; true ; end ; end
irb> Class.everywhere
=> true
irb> Class.new.everywhere
=> true
irb> Class.only_singleton
=> true
irb> Class.new.only_singleton
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8>
तो विधियां वास्तव में वही हैं। वास्तव में स्रोत कोड में कोई सुराग नहीं है जिसने मुझे इस विचार के लिए प्रेरित किया। यह सिर्फ इतना है कि रूबी दस्तावेज़ क्लास सिंगलटन विधियों से क्लास इंस्टेंस विधि को स्पष्ट रूप से अलग करते हैं। क्या वह अलगाव केवल स्पष्टता के लिए बनाया गया है? – eugeniodepalo
सिंगलटन विधियों से आप कक्षा के तरीकों का मतलब है? – rdvdijk
हां, मेरा मतलब वर्ग विधियां है। – eugeniodepalo
इस प्रश्न के रूप में एक प्रश्न में, संभवतः एक उदाहरण विधि, उदाहरण के एक उदाहरण विधि और एक वर्ग विधि का उदाहरण देने का एक अच्छा विचार है। –