unless operator ruby operators

operator - ruby ||=



Diferencia entre "o" y || en Ruby? (8)

Ambos "o" y "||" evalúa a verdadero si cualquiera de los operandos es verdadero. Evalúan su segundo operando solo si el primero es falso.

Al igual que con "y", la única diferencia entre "o" y "||" es su precedencia.

Solo para hacer que la vida sea interesante, "y" y "o" tienen la misma precedencia, mientras que "&&" tiene una precedencia mayor que "||".

¿Cuál es la diferencia entre or || operadores en Ruby? ¿O es solo preferencia?


Como los otros ya lo han explicado, la única diferencia es la precedencia. Sin embargo, me gustaría señalar que en realidad hay dos diferencias entre los dos:

  1. and , or not tiene una precedencia mucho menor que && , || y !
  2. and or tienen la misma precedencia, mientras que && tiene mayor prioridad que ||

En general, es un buen estilo evitar el uso de and , or not y usar && , || y ! en lugar. (Los desarrolladores principales de Rails, por ejemplo, rechazan parches que usan los formularios de palabras clave en lugar de los formularios del operador).

La razón por la que existen, no es para fórmulas booleanas, sino para flujo de control. Se abrieron paso hacia Ruby a través de la conocida do_this or do_that idioma, donde do_this devuelve false o nil si hay un error y solo entonces es do_that ejecuta en su lugar. (De manera análoga, también está el do_this and then_do_that idioma).

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 al unless .

Es fácil ver por qué en este caso los operadores tienen la precedencia "incorrecta" (es decir, idéntica): nunca se muestran juntos en la misma expresión de todos modos. Y cuando se presentan juntos, generalmente quiere que se evalúen simplemente de izquierda a derecha.


Es una cuestión de precedencia del operador.

|| tiene una precedencia mayor que or .

Entonces, entre los dos, tienes otros operadores que incluyen ternary ( ? : :) Y assignment ( = ), por lo que uno que elijas puede afectar el resultado de los enunciados.

Aquí hay una tabla de precedencia del operador Ruby .

Vea esta pregunta para 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

Ambas declaraciones anteriores se evalúan como true , pero la segunda establece a como false ya que = precedencia es menor que || pero más alto que or .


La forma en que uso estos operadores:

||, && son para lógica booleana. or, and son para flujo de control. P.ej

do_smth if may_be || may_be 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 idioma bien conocido en Rails es render and return . Es un atajo para decir return if render , mientras que render && return no funciona (ver documentation Rails)


Solo para agregar a la respuesta de mopoke, también es una cuestión de semántica. or se considera una buena práctica porque se lee mucho mejor que || .


y / o son para flujo de control.

Ruby no permitirá esto como una sintaxis válida:

false || raise "Error"

Sin embargo, esto es válido:

false or raise "Error"

Puede hacer el primer trabajo, con () pero usando or es el método correcto.

false || (raise "Error")


o NO es lo mismo que ||

Usar solo || operador en lugar de o operador.

Razones :

  • u operador tiene menor prioridad que ||
  • o tiene menor prioridad que = operador de asignación
  • yy o tienen la misma precedencia, mientras que && tiene mayor prioridad que ||

puts false or true

impresiones: falso

puts false || true

impresiones: verdadero

Yoda: Cuidado, debes serlo.