2009-09-15 20 views

Respuesta

277

and es lo mismo que && pero con lower precedence. Ambos usan short-circuit evaluation.

ADVERTENCIA: and incluso tiene menor prioridad que = así que es conveniente para evitar and siempre

+36

Sería una buena idea especificar que uno normalmente debería usar '&&', mientras que 'y' deberían usarse solo para casos muy específicos. –

+9

Otra buena explicación aquí: http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/. –

+12

Del enlace de Andrew Marshall: "Otra forma de pensar sobre' y' es como un modificador de enunciado 'if' invertido:' next if widget = widgets.pop' se convierte en 'widget = widgets.pop y next'. Esa es una gran manera de poniéndolo, realmente hice que "haga clic" en mi cabeza. (Y 'o' es como un modificador' a menos' invertido). – GMA

220

La diferencia práctica hace la fuerza, lo que puede conducir a un comportamiento peculiar si no está preparado para ello Encuadernación:

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.

+2

' a = foo y bar'_and_ '(a = foo) && bar' demuestra que' y' tiene precedencia menor que '&&'. – sargas

+0

no lo entiendo: ¿qué significa "volver" y "bar"? – BKSpurgeon

+0

'a = foo and bar' es equivalente a' (a =: foo) y nil'. Como la asignación devuelve un valor lógicamente verdadero (': foo'), la segunda parte evalúa, lo que falla y devuelve' nil'. – tadman

49

El Ruby Style Guide dice mejor que pude:

Uso & &/|| para expresiones booleanas, y/o para flujo de control. (Regla de general: Si usted tiene que utilizar paréntesis exteriores, está utilizando las equivocadas operadores.)

# boolean expression 
if some_condition && some_other_condition 
    do_something 
end 

# control flow 
document.saved? or document.save! 
+38

En realidad, la [** guía ahora dice **] (https://github.com/bbatsov/ruby-style-guide/commit/5920497452c1f6f604742a735f5684e86d4c0003) para evitar 'y'/'or' por completo, y pueden tener un punto . A menudo su uso en el flujo de control [podría escribirse más obviamente con los operadores 'if' /' a menos'] (http://devblog.avdi.org/2010/08/02/using-and-and-or-r-ruby /) de todos modos (p. ej., 'document.save! al menos document.saved?') – Yarin

+0

@akostadinov en caso de que no esté buscando: la guía 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 era [principalmente] (https://github.com/bbatsov/ruby-style-guide/graphs/contributors) por Bozhidar Batsov. –

+0

@AndrewGrimm, gracias, es bueno saberlo. Perdón por trolling pero estoy sinceramente confundido con algunos aspectos de la realidad ruby.Una cosa es segura: cada proyecto de ruby ​​necesita políticas de estilo estrictas para mantener la base de código mantenible. – akostadinov

33

|| y && se unen con la precedencia que se 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 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 menor prioridad que =:

> a = true && false 
=> false 
> a 
=> false 
> a = true and false 
=> false 
> a 
=> true 

Lo que es más, a diferencia de && y ||, and y or se 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 débilmente vinculante and y or puede ser útil para fines de flujo de control: ver http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/.

+1

"a diferencia de' || ',' or' tiene una prioridad menor que '=' "... ahora tiene más sentido, ¡gracias! –

13

and tiene una prioridad menor que &&.

Pero para un usuario poco exigente, pueden surgir problemas si se utiliza junto con otros operadores cuya prioridad se encuentra entre ellos, por ejemplo, el operador de asignación.

por ejemplo

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 
+0

Gracias, pero ¿cómo es la precedencia de "y" diferente de "&&"? – BKSpurgeon

+1

@BKSpurgeon Consulte [aquí] (https://ruby-doc.org/core-2.4.1/doc/syntax/precedence_rdoc.html) para obtener una lista ordenada de la precedencia del operador en Ruby. – thutt

3

y tiene precedencia más baja, la mayoría lo usamos como modificador de flujo de control tales como si

next if widget = widgets.pop 

convierte

widget = widgets.pop and next 

para o

raise "Not ready!" unless ready_to_rock? 

convierte

ready_to_rock? or raise "Not ready!" 

Yo prefiero usar si pero no y, porque si es más inteligible, por lo que sólo ignoro y y o .

Referencia Para

Using “and” and “or” in Ruby

Cuestiones relacionadas