Respuestas:
andes lo mismo &&pero con menor precedencia . Ambos utilizan la evaluación de cortocircuito .
ADVERTENCIA: andincluso tiene una precedencia menor que la =que generalmente querrá evitar and. Se andpuede 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 andque se debe usar solo para casos muy específicos.
andes como un ifmodificador de declaración invertida : se next if widget = widgets.popconvierte widget = widgets.pop and next. Esa es una gran manera de decirlo, realmente lo hizo" hacer clic "en mi cabeza. (Y ores como un unlessmodificador 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 andtiene menor prioridad que &&.
a = foo and bares 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/ orcompletamente, y podrían tener un punto. A menudo, su uso en el flujo de control podría escribirse más obviamente con if/ unlessoperadores 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).
andy ortienen menor prioridad.
Por ejemplo, a diferencia ||, ortiene menor prioridad que =:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Asimismo, a diferencia &&, andtambién tiene menor prioridad que =:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Además, a diferencia de &&y ||, andy se orunen 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 andy orpuede ser útil para fines de control de flujo: consulte http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||, ortiene menor prioridad que =" ... ahora tiene más sentido, ¡gracias!
andtiene 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
andtiene 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 ifpero no and, porque ifes más inteligible, así que simplemente ignoro andy 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
ory||.