2014-06-05 7 views
12

नीचे दिए गए कोड से, ऐसा लगता है कि ||= ऑपरेटर का मूल्यांकन कक्षा के बाहर से किया जा रहा है। self.bar = self.bar || 'baz' रूप baz विधि नए सिरे से लिखना त्रुटि उठाना नहीं हैरूबी सशर्त-असाइनमेंट और निजी तरीके

In other words, the expansion c = c || 3 is (excluding bugs like in pre-1.9) correct. 

:

class Foo 
    attr_reader :bar 

    def baz 
    self.bar ||= 'baz' 
    end 

    private 

    attr_writer :bar 
end 

puts Foo.new.baz 
# => in `baz': private method `bar=' called for #<Foo:0x007fd9720829a8> (NoMethodError) 

Official expansion of ||= conditional assignment operator पर स्वीकार किए जाते हैं जवाब से हवाला देते हुए।

मैं क्यों रूबी इस तरह से बर्ताव कर रही है कैसे और पर एक निश्चित जवाब रहा हूँ, क्योंकि यह काउंटर सहज लगता है।

यह व्यवहार रूबी संस्करण 1.9.3, 2.0.0 और 2.1.2 पर मौजूद है, जो मुझे विश्वास दिलाता है कि यह एक बग नहीं है।

+0

'self.bar || = 'baz'' का मतलब' स्व .बार || self.bar = 'baz''। –

+0

@ArupRakshit लेकिन यह अभी भी यह नहीं समझाता कि यह एक त्रुटि क्यों फेंकता है, है ना? –

+0

@FarrukhAbdulkadyrov वह स्पष्टीकरण नहीं था, यह ओपी के लिए है। जिन्होंने वाक्यविन्यास '|| =' गलत तरीके से व्याख्या की ... –

उत्तर

6

यह bug जैसा दिखता है।

अद्यतन: bug ट्रंक में fixed था, और slated for back porting to 2.1 and 2.0 है।

ध्यान दें कि समस्या यह है कि अधिक से अधिक सामान्य है, यह सभी संक्षिप्त कार्य, सिर्फ सशर्त नहीं संक्षिप्त कार्य के लिए दिया गया है:

private def foo=(*) end 
public def foo; 0 end 

self.foo = 42 

self.foo += 42 
# private method `foo=' called for main:Object (NoMethodError) 

private :foo 

self.foo += 42 
# private method `foo' called for main:Object (NoMethodError) 
+0

हां। यह एक बग है। मैं इसे लॉग करने वाला हूं। लेकिन वहां जाने से पहले यह अच्छा है, मैं यहाँ आया ... –

+0

अद्यतन के लिए धन्यवाद .. –

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