tipos - ¿Símbolos dobles de tubería en la asignación de variables Ruby?
ruby puts (3)
El código foo ||= bar
es casi equivalente a foo = foo || bar
foo = foo || bar
. En Ruby (como en muchos idiomas, como JavaScript o Io), los operadores booleanos son operadores de "guardia". En lugar de devolver siempre true
o false
, evalúan el valor del primer operando que evalúa a un valor "verdadero".
Por ejemplo, este código foo = 1 || delete_all_files_from_my_computer()
foo = 1 || delete_all_files_from_my_computer()
no eliminará nada: foo se establecerá en 1
y el segundo operando ni siquiera se evaluará .
En Ruby, los únicos valores "no verdaderos" son nil
y false
. Entonces, el código foo ||= bar
solo evaluará la bar
y establecerá foo
en el resultado si foo
es nil
o false
.
Como las variables de instancia son predeterminadas a nil
cuando no están establecidas, el código como @foo ||= bar
es una expresión común de Ruby para establecer la variable de instancia si aún no se ha establecido.
Posible duplicado:
¿Qué significa || = en Ruby?
Perdóname si esto es una pregunta nueva pero estoy leyendo un libro sobre rieles donde el escritor usó esta expresión en un método de ayuda:
@current_user ||= User.find_by_id(session[:user_id])
¿Sigue siendo este uso de tubos dobles una declaración booleana OR?
¿Si es así, cómo funciona?
Es una asignación condicional. Desde here :
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
Puedes pensar que es la abreviatura de:
@current_user = @current_user || User.find_by_id(session[:user_id])
@current_user
se evalúa primero, si no es nulo, el OR devuelve el valor de @current_user y no llama a User.find_by_id.