2014-06-05 10 views
12

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.

+0

'self.bar || = 'baz'' significa' auto .bar || self.bar = 'baz''. –

+0

@ArupRakshit ma ancora non spiega perché genera un errore, vero? –

+0

@FarrukhAbdulkadyrov Questa non era una spiegazione, è per OP. chi ha interpretato la sintassi '|| =' erroneamente ... –

risposta

6

Sembra un bug.

AGGIORNAMENTO: Il bug era fixed nel bagagliaio ed è slated for back porting to 2.1 and 2.0.

Si noti che il problema è più generale di quello, si è rotto per tutti assegnazioni abbreviati, non solo condizionali assegnazioni abbreviati:

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

Sì. È un bug. Sto per registrarlo. Ma è bello prima di andarci, sono venuto qui ... –

+0

Grazie per l'aggiornamento .. –