2011-12-14 14 views
13

¿Podría alguien explicarme el significado del siguiente código de Ruby? (Vi este fragmento de código en el proyecto de un solo hombre):'|| =' operador en Ruby

car ||= (method_1 || method_2 || method_3 || method_4) 

¿Cuál es la diferencia entre el código anterior y el siguiente código?

car = method_1 || method_2 || method_3 || method_4 

actualización ---------- --------------

Ok, me dieron el significado de ||= operador después de leer @ La explicación de Dave, mi pregunta siguiente es si ambos method_2, method_3 y method_4 devuelven un valor, ¿cuál será asignado a car? (Supongo car es nil inicialmente)

+1

http://stackoverflow.com/questions/995593/what-does-mean-in-ruby –

+1

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 doble en Ruby Variable Assignment?] (Http://StackOverflow.Com/q/4500375/), [¿Qué significa el "' || = '" operando en ruby] (http://StackOverflow.Com/q/5124930/), [¿qué significa '|| =' en el lenguaje de Ruby?] (http://StackOverflow.Com/q/5230162/), [Es el ruby operator '|| =' intelligent?] (http://StackOverflow.Com/q/2989862/), ... –

+0

... [¿Qué significa '|| =' significa?] (http://StackOverflow.Com/q/ 7556902 /), [¿Qué significa "' || = '" en Ruby 1.9.2?] (Http://StackOverflow.Com/q/7714803/), y probablemente muchos otros también. Ver también [La lista definitiva de hilos y páginas '|| =' (OR Equal)] (http://Ruby-Forum.Com/topic/151660/). –

Respuesta

10

Es un operador de asignación de 'asignación condicional'

Ver aquí ->http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators

asignación condicional:

x = find_something() #=>nil 
x ||= "default"  #=>"default" : value of x will be replaced with "default", but only if x is nil or false 
x ||= "other"  #=>"default" : value of x is not replaced if it already is other than nil or false 

operador || = es una forma abreviada de la expresión:

x = x || "default" 

EDIT:

Después de ver edición de OP, el ejemplo es sólo una extensión de esto, lo que significa:

car = method_1 || method_2 || method_3 || method_4 

asignará el primer no-nula o valor de retorno no falsa de method_1, method_2, method_3 , método_4 (en ese orden) a car o retendrá su valor anterior.

+1

Su explicación es un poco diferente de otras, pero me gusta su explicación porque ha señalado el punto clave de usar este operador (asignación condicional). Aunque es mejor si también puede mencionar x || = Y es igual ax = x || y –

+0

Por favor revise mi actualización, tengo una nueva pregunta al operador. –

+0

Hola, me alegro de haber ayudado, he editado mi respuesta para incluir un poco más, espero que aborde su primer comentario y actualice sus preguntas. – Dave

4
car ||= (method_1 || method_2) 

es equivalente a

car = (car || (method_1 || method_2)) 

En general,

x op= y 

significa

x = x op y 
+0

@ Leem.fin: Usted ve mi edición también. 'car || = anything' significa' car = auto || cualquier cosa' –

+0

¡Oh! Ya veo. Pensé que sería '||' con todas las combinaciones posibles con la parte del lado derecho del signo '=' es por eso que agrego más métodos. –

+0

@ Armen, ¿qué opinas sobre la explicación de @ Dave –

0

automóvil || = (método_1 || method_2)

es igual a

coche = coche || (Method_1 || method_2)

+0

-1. Esto está mal. 'a || = b' es mucho más parecido a' a || a = b' que 'a = a || b', aunque en realidad no es equivalente a * cualquiera de los dos. –

0

en resumen, es igual a:

car = car || method_1 || method_2 

en más detalles, que es un poco más complejo:

car = (defined?(car) && car) || (method_1 || method_2) 

en cualquier caso, lo que viene después de la ||= se única se ejecutará si car:

  • aún no está definido
  • es false
  • es nil
1
car ||= (method_1 || method_2 || method_3 || method_4) 

coche conservará su valor después de ejecutar esta declaración, si el coche al principio no es nula.

Si el coche era nulo antes de esta afirmación, se asignará el primer valor no nulo del método_1, método_2, ... al automóvil.


car = method_1 || method_2 || method_3 || method_4 

En este caso, el coche será reasignado el primer valor no nulo para volver a cabo de los métodos, incluso si el coche ya tiene un valor no nulo antes de que esta sentencia se ejecutó

3

la ||= el operador verifica primero, si su valor car ya está configurado. Si car devuelve cero, asignará el primer valor en el lado derecho que no devuelve nil o false.

Por lo tanto, dada su ejemplo de arriba, si asigna un valor al coche como

car = "BMW" 

y ejecutar su código-fragmento, el valor del coche va a seguir siendo "BMW";

Si se vuelve a method_1 (por ejemplo) la cadena "Value from Method 1" y el coche es nil o false, a continuación coche esta cadena serán asignados a coche

car = nil 
car ||= (method_1 || method_2) 
car # => "Value from Method 1" 

Si method_1 también devuelve nil/false, se comprobará la valor en method_2, y así sucesivamente, hasta que obtenga algún tipo de valor verdadero

La diferencia con su segundo fragmento de código es que en el caso de ||= se evaluará primero la variable car y se establecerá si es se vuelve nulo o falso.

Si usa = solamente, no se realizará ninguna evaluación y el automóvil se establecerá en el primer valor a la derecha que no devuelva nulo o falso.

- ACTUALIZACIÓN -

Para responder a su pregunta actualización, se evaluará el valor en el lado derecho de izquierda a derecha, por lo que el primero de ellos que no devuelve se le asignará nil o false.

car = nil 
# method_1 => "nil" 
# method_2 => "false" 
# method_3 => "value method 3" 
# method_4 => "I won't be called" 

car ||= (method_1 || method_2 || method_3 || method_4) 
# => "value method 3" 
+0

Hola, tu respuesta también es excelente. Subí tuyo. ¡Gracias! –

+0

gracias y aplausos :-) – klaffenboeck

0

respuesta a la actualización:

method_2 se asigna ya que es el primer valor que no es falsa, no nula en la lista.

Cuestiones relacionadas