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.
or
y||
.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á evitarand
. Seand
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 ".fuente
&&
, mientrasand
que se debe usar solo para casos muy específicos.and
es como unif
modificador de declaración invertida : senext if widget = widgets.pop
conviertewidget = widgets.pop and next
. Esa es una gran manera de decirlo, realmente lo hizo" hacer clic "en mi cabeza. (Yor
es como ununless
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:
Lo mismo funciona para
||
yor
.fuente
a = foo and bar
y(a = foo ) && bar
demuestra queand
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, regresandonil
.La Guía de estilo Ruby lo dice mejor de lo que podría:
fuente
and
/or
completamente, y podrían tener un punto. A menudo, su uso en el flujo de control podría escribirse más obviamente conif
/unless
operadores 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).and
yor
tienen menor prioridad.Por ejemplo, a diferencia
||
,or
tiene menor prioridad que=
:Asimismo, a diferencia
&&
,and
también tiene menor prioridad que=
:Además, a diferencia de
&&
y||
,and
y seor
unen con igual precedencia:El enlace débil
and
yor
puede ser útil para fines de control de flujo: consulte http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .fuente
||
,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:
fuente
and
tiene menor precedencia, principalmente lo usamos como un modificador de flujo de control comoif
:se convierte
Para
or
:se convierte
Prefiero usar
if
pero noand
, porqueif
es más inteligible, así que simplemente ignoroand
yor
.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