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
es lo mismo que &&
pero con menor precedencia . Ambos utilizan la evaluación de cortocircuito .
ADVERTENCIA: and
incluso tiene una prioridad menor que =
por lo que querrá evitar and
siempre
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