Diferencia entre "o" y || en Rubí? [duplicar]
¿ Cuál es la diferencia entre los operadores or
y ||
en Ruby? ¿O es simplemente preferencia?
Es una cuestión de precedencia del operador.
||
tiene mayor precedencia que or
.
Entonces, entre los dos tiene otros operadores, incluidos ternario ( ? :
) y asignación ( =
), por lo que cuál elija puede afectar el resultado de las declaraciones.
Aquí hay una tabla de precedencia de operadores Ruby .
Consulte esta pregunta para ver otro ejemplo usando and
/ &&
.
Además, tenga en cuenta algunas cosas desagradables que podrían suceder:
a = false || true #=> true
a #=> true
a = false or true #=> true
a #=> false
Las dos declaraciones anteriores se evalúan como true
, pero la segunda se establece a
como false
ya que =
la precedencia es inferior ||
pero superior a or
.
Como ya han explicado los demás, la única diferencia es la precedencia. Sin embargo, me gustaría señalar que en realidad existen dos diferencias entre ambos:
and
,or
ynot
tienen una precedencia mucho menor que&&
,||
y!
and
yor
tienen la misma precedencia, mientras que&&
tienen mayor precedencia que||
En general, es un buen estilo evitar el uso de and
, or
y not
y utilizar &&
, ||
y !
en su lugar. (Los desarrolladores principales de Rails, por ejemplo, rechazan los parches que utilizan formularios de palabras clave en lugar de formularios de operadores).
La razón por la que existen no es para fórmulas booleanas sino para el flujo de control. Llegaron a Ruby a través del conocido do_this or do_that
modismo de Perl, donde do_this
se devuelve false
o nil
si hay un error y sólo entonces se do_that
ejecuta. (De manera análoga, también existe el do_this and then_do_that
modismo).
Ejemplos:
download_file_via_fast_connection or download_via_slow_connection
download_latest_currency_rates and store_them_in_the_cache
A veces, esto puede hacer que el control fluya un poco más fluido que usar if
o unless
.
Es fácil ver por qué en este caso los operadores tienen una precedencia "incorrecta" (es decir, idéntica): de todos modos, nunca aparecen juntos en la misma expresión. Y cuando aparecen juntos, generalmente querrás que se evalúen simplemente de izquierda a derecha.
and
/ or
son para controlar el flujo.
Ruby no permitirá esto como sintaxis válida:
false || raise "Error"
Sin embargo esto es válido:
false or raise "Error"
Puedes hacer el primer trabajo, ()
pero usar or
es el método correcto.
false || (raise "Error")
puts false or true
--> imprime: falso
puts false || true
--> imprime: verdadero
La forma en que uso estos operadores:
||, &&
son para lógica booleana. or, and
son para controlar el flujo. P.ej
do_smth if may_be || may_be
-- evaluamos la condición aquí
do_smth or do_smth_else
-- definimos el flujo de trabajo, que es equivalente a
do_smth_else unless do_smth
para dar un ejemplo simple:
> puts "a" && "b"
b
> puts 'a' and 'b'
a
Un modismo muy conocido en Rails es render and return
. Es un atajo para decir return if render
, mientras render && return
no funcionará. Consulte " Evitar errores de doble renderizado " en la documentación de Rails para obtener más información.