Respuestas:
and
es lo mismo &&
pero con menor precedencia . Ambos utilizan la evaluación de cortocircuito .
ADVERTENCIA: and
incluso tiene una precedencia menor que la =
que generalmente querrá evitar and
. Se and
puede encontrar un ejemplo de cuándo se debe utilizar en la Guía de Rails en "Cómo evitar errores de doble representación ".
&&
, mientras and
que se debe usar solo para casos muy específicos.
and
es como un if
modificador de declaración invertida : se next if widget = widgets.pop
convierte widget = widgets.pop and next
. Esa es una gran manera de decirlo, realmente lo hizo" hacer clic "en mi cabeza. (Y or
es como un unless
modificador invertido ).
La diferencia práctica es la fuerza de unión, que puede conducir a un comportamiento peculiar si no está 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
.
a = foo and bar
y (a = foo ) && bar
demuestra que and
tiene menor prioridad que &&
.
a = foo and bar
es equivalente a (a = :foo) and nil
. Dado que la asignación devuelve un valor lógicamente verdadero ( :foo
), la segunda parte evalúa, que falla, regresando nil
.
La Guía de estilo Ruby lo dice mejor de lo que podría:
Utilice && / || para expresiones booleanas y / o para flujo de control. (Regla de oro: si tiene que usar paréntesis externos, está usando los operadores incorrectos).
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
and
/ or
completamente, y podrían tener un punto. A menudo, su uso en el flujo de control podría escribirse más obviamente con if
/ unless
operadores de todos modos (por ejemplo document.save! unless document.saved?
)
||
y &&
enlazar con la precedencia que espera de los operadores booleanos en lenguajes de programación ( &&
es muy fuerte, ||
es un poco menos fuerte).
and
y or
tienen menor prioridad.
Por ejemplo, a diferencia ||
, or
tiene menor prioridad que =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Asimismo, a diferencia &&
, and
también tiene menor prioridad que =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Además, a diferencia de &&
y ||
, and
y se 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
puede ser útil para fines de control de flujo: consulte http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||
, or
tiene menor prioridad que =
" ... ahora tiene más sentido, ¡gracias!
and
tiene menor prioridad que &&
.
Pero para un usuario sin pretensiones, pueden surgir problemas si se usa junto con otros operadores cuya prioridad está en el medio, por ejemplo, el operador de asignación:
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
and
tiene menor precedencia, principalmente lo usamos como un modificador de flujo de control como if
:
next if widget = widgets.pop
se convierte
widget = widgets.pop and next
Para or
:
raise "Not ready!" unless ready_to_rock?
se convierte
ready_to_rock? or raise "Not ready!"
Prefiero usar if
pero no and
, porque if
es más inteligible, así que simplemente ignoro and
y or
.
Consulte " Uso de" y "y" o "en Ruby " para obtener más información.
No sé si esta es la intención de Ruby o si es un error, pero intente este código a continuación. Este código se ejecutó en Ruby versión 2.5.1 y estaba en un sistema Linux.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or
y||
.