unless operator ruby operators

operator - ruby ||=



¿Diferencia entre “y” y && en Ruby? (7)

¿Cuál es la diferencia entre los operadores de && y and en Ruby?


La Guía de Ruby Style lo dice mejor de lo que yo podría:

Utilice && / || para expresiones booleanas, y / o para flujo de control. (Regla de oro: si tiene que usar paréntesis externos, está utilizando los operadores incorrectos).

# boolean expression if some_condition && some_other_condition do_something end # control flow document.saved? or document.save!


La diferencia práctica es la fuerza vinculante, que puede llevar a un comportamiento peculiar si no estás preparado para ello:

foo = :foo bar = nil a = foo and bar # => nil a # => :foo a = foo && bar # => nil a # => nil a = (foo and bar) # => nil a # => nil (a = foo) && bar # => nil a # => :foo

Lo mismo funciona para || y or .


No sé si esta es la intención de Ruby o si se trata de un error, pero intente este código a continuación. Este código se ejecutó en la versión 2.5.1 de Ruby y estaba en un sistema Linux.

puts 1 > -1 and 257 < 256 # => false puts 1 > -1 && 257 < 256 # => true



and tiene menor precedencia que && .

Pero para un usuario sin pretensiones, pueden surgir problemas si se usa junto con otros operadores cuya prioridad está en medio, por ejemplo, el operador de asignación.

p.ej

def happy?() true; end def know_it?() true; end todo = happy? && know_it? ? "Clap your hands" : "Do Nothing" todo # => "Clap your hands" todo = happy? and know_it? ? "Clap your hands" : "Do Nothing" todo # => true


|| y && unen con la prioridad que espera de los operadores booleanos en los lenguajes de programación ( && es muy fuerte, || es ligeramente menos fuerte).

and y or tienen menor prioridad.

Por ejemplo, a diferencia de || , or tiene menor prioridad que = :

> a = false || true => true > a => true > a = false or true => true > a => false

Del mismo modo, a diferencia de && , and también tiene una prioridad más baja que = :

> a = true && false => false > a => false > a = true and false => false > a => true

Además, a diferencia de && y || , and y or unen con igual precedencia:

> !puts(1) || !puts(2) && !puts(3) 1 => true > !puts(1) or !puts(2) and !puts(3) 1 3 => true > !puts(1) or (!puts(2) and !puts(3)) 1 => true

El enlace débil and y or pueden ser útiles para fines de control-flujo: consulte devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby .


y tiene una prioridad menor, principalmente lo usamos como modificador de flujo de control como si

next if widget = widgets.pop

se convierte en

widget = widgets.pop and next

para o

raise "Not ready!" unless ready_to_rock?

se convierte en

ready_to_rock? or raise "Not ready!"

Prefiero usar si pero no y , porque si es más inteligible, así que simplemente ignoro y y y o .

Referencia a

Usando “y” y “o” en Ruby