2011-09-26 47 views
8

he un método protegido en mi controlador de aplicación¿Qué significa || =?

def current_user 
    @current_user ||= User.find_by_id(session[:user_id]) 
end 

Me preguntaba qué ||= medios? He estado intentando buscar y averiguar, pero fue en vano.

+0

No estoy seguro si el nombre se aplica, pero en C# se llama el operador nulo-coalescente http://msdn.microsoft.com/en-us/library/ms173224.aspx – kenny

+0

Gracias a todos por ayudarme y ponerme ¡en la dirección correcta! – pka

+3

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/), [qué hace un '|| = '¿significa en lenguaje de Ruby?] (http://StackOverflow.Com/q/5230162/), [¿Es el operador de ruby' || = 'intelligent?] (http://StackOverflow.Com/q/2989862/) y probablemente muchos otros también. –

Respuesta

11

Básicamente, a ||= b significa assign b to a if a is null or undefined or false (i.e. false-ish value in ruby), es un atajo a a = b unless a.

+1

Consulte también * Asignación condicional * en [Programación de Ruby/Sintaxis/Operadores] (http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#1._Assignment). – rdvdijk

+1

Es importante darse cuenta de que también está cortocircuitando - 'b' no se ejecutará si' a' es 'falso-ish' (por ejemplo, ahorrando tiempo al no hacer una consulta de DNS costosa). –

+1

no es 'a = b a menos que' Por favor, consulte http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html para una mejor comprensión de cómo funciona realmente. – Sigurd

3

|| = es un idioma ruby. Significa que si @current_user es nil (o falso), entonces intente buscarlo por id y asígnelo a @current_user; de lo contrario, no haga nada.

Ver esto relatedquestions.

3

Esto es parte de Ruby.

Si @current_user es nula o falsa, que se establecerá en User.find_by_id(session[:user_id])

0

Aviso los paralelos con a += b, lo que equivale a a = a + b.

a ||= b es equivalente a a = a || b. Como otros han mencionado, esto es lo mismo que a = b unless a.

+1

En realidad, Ruby no debería asignar en caso de que 'a' no sea' falso-ish', de modo que 'a = a || b' no es estrictamente equivalente a 'a = b a menos que a'. Uno podría pensar específicamente en las implicaciones en caso de que 'a' sea, por ejemplo, un 'Hash'. – Romain

+0

No, no lo es, como se ha discutido varias veces aquí en SO, docenas de veces en las listas de correo de Ruby y literalmente cientos de veces en miles de publicaciones en el blog. –

+0

Oh, claro. ¿Me puede dar un ejemplo de cuando este no es el caso? – grifaton

0

En ruby ​​'a || = b' se llama operador "o - igual". Es una forma breve de decir si a tiene un valor booleano de verdadero (si no es falso o nulo) tiene el valor de a. Si no, tiene el valor de b.

0

Básicamente, un || = b significa asignar B a A si a es nulo o no definido o falso (es decir, valor falso-ish en rubí), es un acceso directo a a = B a menos a.

compartir | editar contestado 26 '11 septiembre a las 14:48

Romain 6,9711330

Además de esta respuesta Aquí `un ejemplo -

arr = nil || [] 
arr0 ||= [] 

arr <=> arr0 *#=> 0* 

Estos medios La expresión arr y la expresión arr0 son iguales.

Espero que esto ayude a comprender mejor ||= operador.