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 ".
Desde el enlace de Andrew Marshall: "Otra forma de pensar 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 ).
GMA
1
Combine esta respuesta con los detalles de la respuesta de tadman y obtendrá la imagen completa.
sargas
55
Avdi actualizó su opinión sobre cuándo usar y vs. &&. Básicamente use 'y' y 'o' para el flujo de control debido a su precedencia más baja. devblog.avdi.org/2014/08/26/…
EricC
238
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
a = foo and bary(a = foo ) && bar demuestra que andtiene menor prioridad que &&.
sargas
no lo entiendo: ¿qué significa "foo and bar" para regresar?
BKSpurgeon
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.
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).
@akostadinov en caso de que no estuvieras trolleando: la guía de Ruby Style no está escrita por los creadores de Ruby. Ruby fue creado por Yukihiro Matsumoto y otros, mientras que la Guía de Estilo Ruby fue principalmente por Bozhidar Batsov.
Andrew Grimm
2
@ AndrewGrimm, gracias, es bueno saberlo. Perdón por trollear, pero estoy sinceramente confundido con algunos aspectos de la realidad de rubí. Una cosa es segura: cada proyecto ruby necesita políticas de estilo estrictas para mantener la base de código mantenible.
akostadinov
37
||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 =falseortrue=>true> a
=>false
Asimismo, a diferencia &&, andtambién tiene menor prioridad que =:
> a =true&&false=>false> a
=>false> a =trueandfalse=>false> a
=>true
Además, a diferencia de &&y ||, andy se orunen con igual precedencia:
"a diferencia ||, ortiene menor prioridad que =" ... ahora tiene más sentido, ¡gracias!
Steph Sharp
18
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;enddef 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
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.
ory||.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á evitarand. Seandpuede encontrar un ejemplo de cuándo se debe utilizar en la Guía de Rails en "Cómo evitar errores de doble representación ".fuente
&&, mientrasandque se debe usar solo para casos muy específicos.andes como unifmodificador de declaración invertida : senext if widget = widgets.popconviertewidget = widgets.pop and next. Esa es una gran manera de decirlo, realmente lo hizo" hacer clic "en mi cabeza. (Yores como ununlessmodificador invertido ).La diferencia práctica es la fuerza de unión, que puede conducir a un comportamiento peculiar si no está preparado para ello:
Lo mismo funciona para
||yor.fuente
a = foo and bary(a = foo ) && bardemuestra queandtiene 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, regresandonil.La Guía de estilo Ruby lo dice mejor de lo que podría:
fuente
and/orcompletamente, y podrían tener un punto. A menudo, su uso en el flujo de control podría escribirse más obviamente conif/unlessoperadores de todos modos (por ejemplodocument.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).andyortienen menor prioridad.Por ejemplo, a diferencia
||,ortiene menor prioridad que=:Asimismo, a diferencia
&&,andtambién tiene menor prioridad que=:Además, a diferencia de
&&y||,andy seorunen con igual precedencia:El enlace débil
andyorpuede ser útil para fines de control de flujo: consulte http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .fuente
||,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:
fuente
andtiene menor precedencia, principalmente lo usamos como un modificador de flujo de control comoif:se convierte
Para
or:se convierte
Prefiero usar
ifpero noand, porqueifes más inteligible, así que simplemente ignoroandyor.Consulte " Uso de" y "y" o "en Ruby " para obtener más información.
fuente
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.
fuente