2017-03-21 6 views
7

यहां एक दिलचस्प मामला है जिसे मैं समझा नहीं सकता। ऐसा लगता है कि निजी सेटर्स 'तरह' निजी हैं, लेकिन कभी-कभी इसमें अपवाद भी होते हैं। नियमित रूप से निजी तरीकों निजी setters के लिए अलग तरह से व्यवहार करने लगते हैं:निजी सेटर्स अन्य निजी तरीकों से अलग तरीके से क्यों व्यवहार करते हैं?

class TestClass 
    def do 
    self.foo = :bar # fine 
    self.baz  # error 
    end 

    private 

    def foo=(other) 
    @foo = other 
    end 

    def baz 
    end 
end 

TestClass.new.do 

उपरोक्त कोड, @foo ठीक सेट एक स्पष्ट self पर बुलाया जा रहा है के बावजूद। फिर यह #baz पर कॉल करने में विफल रहता है, क्योंकि #baz एक निजी विधि है।

इसके साथ क्या चल रहा है?

+1

आम तौर पर मैं 'baz' उपसर्ग' self' का उपयोग किए बिना कहेंगे, और कहा कि इस मामले में काम करना चाहिए। लेकिन मुझे एहसास है कि आपके प्रत्यक्ष प्रश्न का उत्तर नहीं देता है। – moveson

उत्तर

4

निजी setters विशेष क्योंकि अन्यथा वे सब पर नहीं कहा जा सकता है।

ध्यान दें कि सेटर्स एकमात्र चीजें नहीं हैं जिन्हें स्पष्ट रिसीवर के बिना नहीं कहा जा सकता है। [email protected], [email protected], !, ~, [], []=, +, -, *, /, %, &, |, ^, **, <<, >>, ==, ===, =~, !~, !=, <, >, <=, >=, <=> और संभवतः कुछ अन्य जिन्हें मैं भूल गया हूं उन्हें स्पष्ट रिसीवर के बिना भी नहीं बुलाया जा सकता है। और फिर +=, <<= जैसी चीजें हैं और इसी तरह।

उन सभी के लिए अपवाद होने की आवश्यकता है। दुर्भाग्यवश, उनमें से कुछ के लिए केवल अपवाद हैं।

यह एक स्पष्ट रिसीवर के बिना से

केवल कहा जा सकता है private के लिए नियमों को बदलने की, के अलावा प्रस्तावित किया गया है [अपवाद की इस लंबी सूची है जो वास्तव में जटिल है, और अभी भी पूरा नहीं]।

को केवल एक स्पष्ट रिसीवर या शाब्दिक विशेष चर self रिसीवर के रूप में बिना कहा जा सकता है।

जो परिभाषा के सभी मौजूदा गुणों को संरक्षित करता है (सबसे महत्वपूर्ण यह है कि इसे पार्स समय पर स्थिर रूप से निर्धारित किया जा सकता है)।

But so far, nothing has come of it.

1

यदि आप सेटर विधि का उपयोग करते समय self का उपयोग नहीं करते हैं, तो यह इसके बजाय स्थानीय चर के लिए मान असाइन करेगा। More details

नीचे कोड में, मैं foo के लिए काम से self हटा दिया है, और आप देख सकते हैं सेटर इस्तेमाल किया जा रहा नहीं है b/c @foonil है:

def do 
    foo = :bar # fine 
    baz  # error 
    puts @foo # prints nil 
    puts foo # prints 'bar' 
    end 
1

यह सुंदर कितना private काम करता है और यह private और protected रूबी में विधियों के बीच मुख्य अंतर है। आप कक्षा के उदाहरण पर भी private विधियों को कॉल नहीं कर सकते हैं, यहां तक ​​कि उस कक्षा के अंदर भी, जबकि protected इसकी अनुमति देता है।

स्थानीय चर foo को
foo = :bar 

प्रदान करती है, यह संदेश foo= नहीं भेजता है:

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