variable tipos constante alcance ruby boolean variable-assignment

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.