2010-05-10 15 views
13

¿Estoy fundamentalmente malentendiendo a Ruby aquí? He estado escribiendo código Ruby durante unos 2 años y encontré sólo hoy en este ...i = verdadero y falso en Ruby es cierto?

ruby-1.8.7-p249 > i = true and false 
=> false 
ruby-1.8.7-p249 > i 
=> true 

Podría alguien explicar lo que está pasando aquí, por favor? Estoy seguro de que es a las especificaciones, pero sólo parece contrario a la intuición para mí ...

+0

La parte "por qué" es un duplicado de http://stackoverflow.com/questions/1434842/is-there-any-wisdom-behide-and-or-operator-in-ruby, y la parte que es una duplicado de http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-benedwarning- about –

Respuesta

30

Los operadores && y and tienen precedencia diferente, y = pasa a estar en el medio.

irb(main):006:0> i = true and false 
=> false 
irb(main):007:0> i 
=> true 
irb(main):008:0> i = true && false 
=> false 
irb(main):009:0> i 
=> false 
irb(main):010:0> 

El primero se lee como (i = true) and false, la segunda como i = (true && false).

+0

thnx! No me di cuenta de que había una diferencia entre && y, leeré sobre eso. – alex

+3

Es un extraño capricho del lenguaje Ruby. Me encontré con esta advertencia en un artículo de "Ruby para programadores de Python" ayer, en mi primer día de aprendizaje Ruby :) – Thomas

+0

Me resulta extraño que nunca he encontrado este problema porque uso este tipo de declaraciones todo el tiempo. Tengo que volver atrás y revisar una tonelada de código ahora :( – alex

13

and tiene menor precedencia que = por lo i = true and false se analiza como (i = true) and false.

Así que el valor true se asigna a i y luego el valor de retorno de esa operación (lo cual es cierto) es and ed con datos falsos, lo que hace que toda la expresión a evaluar a false, a pesar de que i todavía tiene el valor true.

3

Su línea se analiza como

i = true and false 
(i = true) and false 
true and false 

Y, por supuesto, debido a i = true, i habrá true después.

3

Según entiendo su código, que se interpreta como:

  • Asignar fiel a i i
  • Retorno y falsa

Los resultados parece correcta.

1

Como otros han dilucidado anteriormente, la palabra clave and se utiliza cuando se quiere poner dos diferentes declaraciones en una línea. Es solo una forma más agradable de hacer que tu código sea legible.

Por lo tanto,

i = true and false

implica

i = true; false #(a less widely used code layout in ruby)

o que es la forma más directa:

 

i = true 
false 

Por lo tanto, la salida es correcta. De lo contrario, si esperaba false, utilice el booleano y&&.

+0

¡gracias, eso es bueno saberlo! – alex

+0

Esto es estrictamente hablando incorrecto; si la primera parte de la declaración se evalúa como falsa o nula, la segunda parte nunca se evalúa en absoluto. Entonces, por ejemplo, 'i = falso y do_some_stuff' es muy diferente de' i = falso; do_some_stuff', porque si en el primero, 'do_some_stuff' no se ejecutará. – philomory

Cuestiones relacionadas