2014-06-05 15 views
12

Aşağıdaki koddan, ||= işleci, sınıfa dışarıdan değerlendirilmektedir.Yakut Koşullu-Ödev ve Özel Yöntemler

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 tarihinde kabul edilen yanıt alıntı:

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

hata yükseltmek değil self.bar = self.bar || 'baz' olarak baz yöntemini Yeniden Yazma. Yakut bu şekilde davrandığını neden karşı sezgisel görünüyor beri

Ben nasıl ve üzerinde kesin bir cevap arıyorum.

Bu davranış Ruby'nin 1.9.3, 2.0.0 ve 2.1.2 sürümlerinde bulunmaktadır; bu, bunun bir hata olmadığına inanmamı sağlar.

+0

'self.bar || = 'baz''' kendini ifade eder .bar || self.bar = 'baz'. –

+0

@ArupRakshit ama neden bir hata attığını açıklamıyor, değil mi? –

+0

@FarrukhAbdulkadyrov Bu açıklama değildi, OP için. sözdizimi '|| = yanlış yorumladı… –

cevap

6

bug gibi görünüyor.

GÜNCELLEME: bug, gövde içinde fixed ve slated for back porting to 2.1 and 2.0'dur. Sorun, tüm kısaltılmış atamaları, sadece şartlı değil kısaltılmış atamaları için bozuldu, bundan daha genel olduğunu

Not:

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

Evet. Bu bir böcek. Giriş yapmak üzereyim. Ama oraya gitmeden önce iyiyim, buraya geldim ... –

+0

Güncelleme için teşekkürler .. –