Dal codice seguente, viene visualizzato l'operatore ||=
che viene valutato dall'esterno della classe.Ruby Conditional-Assignment and Private Methods
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)
Citando la risposta accettata sulla Official expansion of ||= conditional assignment operator:
In other words, the expansion c = c || 3 is (excluding bugs like in pre-1.9) correct.
Riscrivere il metodo baz
come self.bar = self.bar || 'baz'
non alzare l'errore.
Sto cercando una risposta definitiva su come e perché Rubino si comporta in questo modo, dal momento che sembra contro-intuitivo.
Questo comportamento è presente nelle versioni di Ruby 1.9.3, 2.0.0 e 2.1.2, il che mi porta a credere che questo non sia un bug.
'self.bar || = 'baz'' significa' auto .bar || self.bar = 'baz''. –
@ArupRakshit ma ancora non spiega perché genera un errore, vero? –
@FarrukhAbdulkadyrov Questa non era una spiegazione, è per OP. chi ha interpretato la sintassi '|| =' erroneamente ... –