2010-09-27 22 views

Respuesta

9

Se utiliza principalmente como un formato abreviado para inicializar una variable a un valor determinado, si aún no se ha establecido.

Piensa en la declaración como return x || (x = y). Si x tiene un valor (que no sea false), va a calificar con certitud sólo el lado izquierdo de la || (ya ||cortos circuts), y x no serán reasignados. Sin embargo, si x es false o nil, se evaluará el lado derecho, que establecerá x en y, y y (el resultado de una declaración de asignación es el lado derecho).

Consulte http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case para obtener más información.

+0

+1 se olvidó –

+0

'x || = y' actúa como' x = y a menos que x' que (si suponemos x e y significan expresiones arbitrarias y no necesariamente variables) es * no * lo mismo que cualquiera de 'x = x || y' (considere los casos donde 'x = x' no es un no-op) o' x = y si x.nil? '(considere el caso donde x es falso). – sepp2k

+0

Jorg W Mittag reconoce que esto es incorrecto, en [su respuesta] (http://stackoverflow.com/questions/995593/what-does-mean-in-ruby) a la pregunta duplicada. –

3

La idea es la misma que con otros operadores similares (+=, *=, etc):
a ||= b es a = a || b

Y este truco no se limita sólo a Ruby: que pasa por muchos idiomas con raíces C.

editar para repeler a los detractores.
Vea uno de los enlaces de Jörg para una aproximación más precisa, por ejemplo this one.
Esto es exactamente por lo que no me gusta Ruby: nada es lo que parece.

+1

Notablemente, no C o C++ o Java. – SingleNegationElimination

+0

@TokenMacGuy Me refiero a 'truco' general: producir 'a @ = b' desde 'a = a @ b'. –

+0

Esto está mal. Por favor, lea http://Ruby-Forum.Com/topic/151660 y los enlaces proporcionados en el mismo. –

4

x ||= y se utiliza a menudo en lugar de x = y if x == nil