2012-03-28 8 views
5

किसी अन्य प्रश्न का उत्तर देते समय, मुझे एहसास हुआ कि निम्न कार्यक्रम ऐसा नहीं करता जो मैंने सोचा था।रूबी वैश्विक दायरा

puts "test" 
self.puts "test" # => private method `puts' called for main:Object (NoMethodError) 

अपवाद मुझे तो हैरानी, ​​जैसा कि मैं हमेशा सोचा था कि शीर्ष स्तर के विधि कॉल main वस्तु दृष्टान्त द्वारा हल किया जा सकता है, लेकिन इस मामले होने के लिए प्रतीत नहीं होता।

पहली कॉल का वास्तविक रिसीवर कौन है और इसे कैसे हल किया जाता है? क्या यह एक विशेष नियम है जो केवल शीर्ष-स्तरीय दायरे पर विधि कॉल पर लागू होता है?

उत्तर

4

यहां एक good discussion है जो इस प्रश्न के बारे में बात करता है।

शीर्ष स्तर विधियों, जो Kernel द्वारा प्रदान की जाती हैं, स्वचालित रूप से ऑब्जेक्ट कक्षा में शामिल की जाती हैं। इसका मतलब है कि कर्नेल विधियों में सबकुछ दिखाई देगा।

त्रुटि private method 'puts' called for main:Object (NoMethodError) सिर्फ यह बताती है कि मौजूद है लेकिन निजी तौर पर स्कॉप्ड है।

ree-1.8.7-2011.03 :001 > puts "test" 
test 
ree-1.8.7-2011.03 :004 > self.send(:puts, "hi") 
hi 

अद्यतन

कर्नेल तरीकों के लिए कोई जादू नहीं है। कोई गुंजाइश या कुछ भी नहीं है। मुझे लगता है कि self का उपयोग करते समय गुंजाइश क्या है। आपके पास self का उपयोग करके निजी विधियों तक पहुंच नहीं है।

class PutsTest 

    def success_puts 
    private_puts 
    end 

    def failed_puts 
    # trying to access a private method from self 
    self.private_puts 
    end 

    private 

    def private_puts 
    puts 'hi' 
    end 
end 

स्वयं का उपयोग करके आप के बाहर से कॉल PutsTest

ree-1.8.7-2011.03 :095 > test = PutsTest.new 
ree-1.8.7-2011.03 :096 > test.success_puts 
hi 
ree-1.8.7-2011.03 :097 > test.failed_puts 
NoMethodError: private method `private_puts' called for #<PutsTest:0xd62c48> 
+0

हाँ करने के लिए के अंदर PutsTest विधि कॉल करने से गुंजाइश बदल रहे हैं, लेकिन क्यों मैं एक कॉल कर सकते हैं निजी विधि अगर मैं 'स्वयं' निर्दिष्ट नहीं करता हूं? –

+0

क्योंकि ऑब्जेक्ट के अंदर स्वयं को डाला जाता है, सीधे स्वयं को कॉल करने का मतलब है। इसका मतलब है कि आप स्वयं को स्टेप्ड पेंट विधि को कॉल करने का प्रयास कर रहे हैं। मैं कुछ जवाब के साथ अपना जवाब अद्यतन करें। । – mguymon

+0

उम्मीद है कि कोड उदाहरण बनाम self.puts – mguymon

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