2011-09-25 11 views
6

मैं पढ़ रहा था कि रूबी दुभाषिया कैसे कार्यान्वित किया जाता है, और एक सवाल हुआ कि अभी तक मेरे लिए कोई जवाब नहीं मिला। शीर्षक में यह एक है: चूंकि Class (r_cClass) super है (मेटाग्लास को अनदेखा कर रहा है, वास्तव में superr_cClass का मेटाक्लास है), अगर मैं Class ऑब्जेक्ट को एक विधि भेजता हूं, तो यह विधि तालिका में देखा जाएगा Class 'कक्षा। लेकिन Class 'वर्ग Class है, तो क्या मुझे Class के उदाहरण विधियों को देखना नहीं चाहिए? लेकिन दस्तावेज Class कक्षा विधियों और Class उदाहरण विधियों को अलग करने के बाद से ऐसा नहीं है। रूबी के eval.c में search_method में, मुझे Class कक्षा के लिए कोई विशेष जांच नहीं मिली। क्या कोई इस पर रोशनी डाल सकता है?क्लास कक्षा का वर्ग कैसे हो सकता है और क्लास इंस्टेंस विधियों के पास नहीं हो सकता है?

+0

इस प्रश्न के रूप में एक प्रश्न में, संभवतः एक उदाहरण विधि, उदाहरण के एक उदाहरण विधि और एक वर्ग विधि का उदाहरण देने का एक अच्छा विचार है। –

उत्तर

3

आपके विश्वासों के तरीके के बारे में आपकी मान्यताओं को सही लगता है, लेकिन मुझे यकीन नहीं है कि आपको ऐसा क्यों लगता है कि यह इस तरह से काम नहीं करता है।

रूबी 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> 
+0

तो विधियां वास्तव में वही हैं। वास्तव में स्रोत कोड में कोई सुराग नहीं है जिसने मुझे इस विचार के लिए प्रेरित किया। यह सिर्फ इतना है कि रूबी दस्तावेज़ क्लास सिंगलटन विधियों से क्लास इंस्टेंस विधि को स्पष्ट रूप से अलग करते हैं। क्या वह अलगाव केवल स्पष्टता के लिए बनाया गया है? – eugeniodepalo

+0

सिंगलटन विधियों से आप कक्षा के तरीकों का मतलब है? – rdvdijk

+0

हां, मेरा मतलब वर्ग विधियां है। – eugeniodepalo

संबंधित मुद्दे

 संबंधित मुद्दे