2011-03-08 28 views
8

Duplicar posible:
What does ||= mean in Ruby?¿Qué significa a || = en el lenguaje Ruby?

¿qué significa la línea de abajo?

a ||= {} 
a ||= 1 

en irb siempre devuelve la clase de a, como hash, para las dos líneas anteriores. Gracias de antemano.

+0

@mladen Es cierto, pero personalmente votaría para cerrar la otra pregunta en favor de este. Éste tiene información más actualizada/correcta en la respuesta mejor valorada. –

+0

Duplicado: [¿Qué significa '|| =' en Ruby?] (Http://StackOverflow.Com/q/995593/), [¿Qué significa '|| =' en Ruby?] (Http: // StackOverflow .Com/q/3800957 /), [¿qué es '|| =' en ruby?] (Http://StackOverflow.Com/q/3945711/), [¿Símbolos de tubería dobles en Ruby Variable Assignment?] (Http://StackOverflow.Com/q/4500375/), [¿Qué significa el operando '' || = '" en ruby] (http://StackOverflow.Com/q/5124930/), [Es el operador de ruby ​​'| | = 'inteligente?] (http://StackOverflow.Com/q/2989862/) y probablemente muchos otros también. –

+0

Véase también [La lista definitiva de '|| =' (O iguales) hilos y páginas] (http://Ruby-Forum.Com/topic/151660/). [¿Qué significa '|| =' en Ruby?] (Http://StackOverflow.Com/q/995593/) y [¿Qué significa '|| =' en Ruby?] (Http: // StackOverflow.Com/q/3800957 /) incluso están vinculados a * Preguntas relacionadas *. –

Respuesta

0

Significa

a = a || {} 

es decir

a = {} unless a 
+1

No exactamente. También establecerá a a {} si a es falso. – Dogbert

+0

Sí, recién lo había notado, gracias ;-) –

+0

Y no se asignará a a si es verdadero. – Romain

16

||= es un operador de asignación, que devuelve el valor asignado. a ||= b es equivalente a la instrucción a || a = b, lo que significa que si a está configurado y tiene algún valor verdadero, entonces permanece igual, de lo contrario toma el valor de b.

En su ejemplo a solo se establece una vez, lo que explica el comportamiento que ha notado.

a ||= {} 
a ||= 1 // a is still {} 

Uso típico que he visto es inicializar variables estáticas, es decir.

class Foo 
    def self.bar 
     return @bar ||= {} 
    end 
end 

EDIT:

Cabe mencionar que ||= es un operador de cortocircuito. Esto significa que en el caso de a ||= b solo habrá una asignación de a = b. Nunca habrá una asignación de a = a en el caso de que a sea no falsa. Esto es un poco pedante, pero es importante en algunos (muy) casos extremos.

Para obtener más información, read the definitive list of ||= threads and pages.

+0

Su ejemplo es una variable de instancia, no una variable estática (o de clase). Eso sería '@@ algo'. [sigue siendo la mejor respuesta :)] –

+0

@Simon Acabo de notar lo mismo. Solucionado ahora (aunque no del todo). –

+0

También se utiliza con frecuencia para verificar-asignar cosas en Hashes (à-la: 'hash [key] || = initial_value', especialmente si lo que quieres hacer a continuación es' hash [key] + = value', que sería error si 'hash [key] .nil?' es true-ish). – Romain

0

puede leer "a || = {}" de esta manera. Si se define "a", entonces ignore la expresión del lado derecho. De lo contrario, configure "a" igual a la expresión en el lado derecho. En la primera línea, "a" probablemente no esté definido, por lo que la línea establece "a" a la expresión de la derecha que es el hash vacío. En la segunda línea, "a" ya está configurado como {} por lo que está ignorando la expresión de la derecha que tiene un valor de 1.

+0

No se está verificando si a está definido o no, sino que verifica si a es verdadero (por ejemplo, no es falso ni nulo) o no. – Romain

+0

Bueno, para ser más precisos ... ¡está comprobando si "a" es falso, nulo o NO DEFINITIVO y asigna "a" en consecuencia! – RubyFanatic

+0

Derecha, UNDEFINED no es verdad-ish, eso es verdad :) – Romain

Cuestiones relacionadas