Diferencia entre "o" y || en Rubí? [duplicar]

Resuelto Alex Baranosky asked hace 14 años • 8 respuestas

¿ Cuál es la diferencia entre los operadores ory ||en Ruby? ¿O es simplemente preferencia?

Alex Baranosky avatar Jan 18 '10 06:01 Alex Baranosky
Aceptado

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 acomo falseya que =la precedencia es inferior ||pero superior a or.

mopoke avatar Jan 17 '2010 23:01 mopoke

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:

  1. and, ory nottienen una precedencia mucho menor que &&, ||y!
  2. andy ortienen la misma precedencia, mientras que &&tienen mayor precedencia que||

En general, es un buen estilo evitar el uso de and, ory noty 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_thatmodismo de Perl, donde do_thisse devuelve falseo nilsi hay un error y sólo entonces se do_thatejecuta. (De manera análoga, también existe el do_this and then_do_thatmodismo).

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 ifo 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.

Jörg W Mittag avatar Jan 18 '2010 02:01 Jörg W Mittag

and/ orson 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 ores el método correcto.

false || (raise "Error")
Eadz avatar Apr 09 '2014 05:04 Eadz

puts false or true--> imprime: falso

puts false || true--> imprime: verdadero

Radek Secka avatar Jun 03 '2016 09:06 Radek Secka

La forma en que uso estos operadores:

||, &&son para lógica booleana. or, andson 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 && returnno funcionará. Consulte " Evitar errores de doble renderizado " en la documentación de Rails para obtener más información.

Vadym Tyemirov avatar Jul 19 '2015 18:07 Vadym Tyemirov