2010-06-06 8 views
5

Bit di un caso limite, ma qualsiasi idea perché & & = si comporterebbe in questo modo? Sto usando 1.9.2.Ruby && = edge case

obj = Object.new 
obj.instance_eval {@bar &&= @bar} # => nil, expected 
obj.instance_variables # => [], so obj has no @bar instance variable 

obj.instance_eval {@bar = @bar && @bar} # ostensibly the same as @bar &&= @bar 
obj.instance_variables # => [:@bar] # why would this version initialize @bar? 

Per confronto, || = inizializza la variabile di istanza a zero, come mi aspetto:

obj = Object.new 
obj.instance_eval {@foo ||= @foo} 
obj.instance_variables # => [:@foo], where @foo is set to nil 

Grazie!

+0

Questo post è stato trovato amorevolmente con [SymbolHound] (http://www.symbolhound.com/)! –

risposta

5

Questo è, perché @bar restituisce false, e quindi la &&= valuterebbe no ulteriore espressione ... In contrasto con la vostra seconda espressione, che assegna a @bar in ogni caso, non importa quale sia la seguente espressione risolve. Lo stesso vale per il caso ||= che valuta l'espressione completa, indipendentemente dal valore iniziale @foo risolto.

Quindi la differenza tra le prime due espressioni è, che nella prima cessione dipende dal valore (non definito) di @bar, mentre nel secondo caso si fa un incarico incondizionata. &&= NON è una scorciatoia per x = x && y. È una scorciatoia per x = x && y if x.

+0

Grazie per aver chiarito! Inoltre, appena arrivato alla parte di Programming Ruby 1.9 che spiega questo ... probabilmente dovrebbe averlo cercato:/ –

+0

@Alan sentiti libero di accettare la mia risposta come risposta se risolve la tua domanda. – hurikhan77

+0

Grazie ancora :) Ancora immaginando il sito ... –

Problemi correlati