2010-06-06 7 views
5

Un poco de borde caso, pero alguna idea de por qué & & = se comportaría de esta manera? Estoy usando 1.9.2.Ruby && = borde caso

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? 

Para la comparación, || = inicializa la variable de instancia a cero, como yo esperaría:

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

Gracias!

+0

Este post amorosamente encontrado en [SymbolHound] (http://www.symbolhound.com/)! –

Respuesta

5

Esto es, porque @bar se evalúa como falsa, y por lo tanto la &&= sería evaluar la expresión no más lejos ... En contraste con su segunda expresión, que asigna a @bar, en cualquier caso, no importa lo que la siguiente expresión se resuelve a. Lo mismo ocurre con el caso ||= que evalúa la expresión completa, independientemente del valor inicial resuelto por @foo.

Así que la diferencia entre sus primeras dos expresiones es que en el primero la asignación depende del valor (indefinido) de @bar mientras que en el segundo caso realiza una asignación incondicional. &&= NO es un atajo para x = x && y. Es un atajo para x = x && y if x.

+0

¡Gracias por aclarar! Además, acaba de llegar a la parte de Programación Ruby 1.9 que explica esto ... probablemente debería haberlo buscado:/ –

+0

@ Alan puede aceptar mi respuesta como respuesta si resuelve su pregunta. – hurikhan77

+0

Gracias otra vez :) Aún descubriendo el sitio ... –