Operador ‘|| =’ en Ruby

¿Podría alguien explicarme el significado del siguiente código de Ruby? (Vi este fragmento de código en el proyecto de un tipo):

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

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

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

———-actualizar————–

Ok, obtuve el significado del operador ||= después de leer la explicación de @ Dave, mi siguiente pregunta es si tanto method_2 , method_3 como method_4 devuelven un valor, ¿cuál de los valores asignará al car ? (Supongo que el car es nulo inicialmente)

Es un operador de asignación para ‘Asignación condicional’

Vea 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" 

EDITAR:

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

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

Asignará el primer valor de retorno no nulo o no falso de method_1, method_2, method_3, method_4 (en ese orden) a car o retendrá su valor anterior.

 car ||= (method_1 || method_2) 

es equivalente a

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

En general,

 x op= y 

medio

 x = x op y 

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

Entonces, dado su ejemplo de arriba, si le asigna un valor al auto como

 car = "BMW" 

y ejecuta el fragmento de código, el valor del automóvil seguirá siendo “BMW”;

Si el método_1 devuelve (por ejemplo) la cadena "Value from Method 1" y el carro es nil o false , entonces este vehículo se asignará al automóvil

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

Si el método_1 también devuelve nil / false , comprobará el 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 ||= la variable car se evaluará primero y se establecerá si devuelve nil o false.

Si usa = solo, 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 de actualización, el valor en el lado derecho se evaluará de izquierda a derecha, por lo que se asignará el primero que no devuelva nada 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" 
 car ||= (method_1 || method_2 || method_3 || method_4) 

el automóvil retendrá su valor después de que se ejecute esta statement, si el automóvil inicialmente no es nulo.

Si el automóvil era nulo antes de esta statement, el primer valor no nulo para regresar del método_1, método_2, … se asignará al automóvil.


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

En este caso, el automóvil será reasignado al primer valor no nulo para volver a salir de los métodos, incluso si el automóvil ya tiene un valor no nulo antes de que se ejecutara esta statement

coche || = (método_1 || método_2)

es igual a

coche = automóvil || (método_1 || método_2)

en resumen, es igual a:

 car = car || method_1 || method_2 

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

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

en cualquier caso, lo que viene después de ||= solo se ejecutará si el car :

  • aún no está definido
  • es false
  • es nil

respuesta para actualizar:

method_2 se asigna porque es el primer valor no falso, no nulo en la lista.