2010-05-10 18 views
13

Perchè sono fondamentalmente incomprensioni di Ruby qui? Ho scritto codice Ruby per circa 2 anni e proprio oggi siamo imbattuti in questo ...i = true e false in Ruby è vero?

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

Qualcuno potrebbe spiegare che cosa sta succedendo qui favore? Sono sicuro che è a spec, ma sembra solo contro intuitivo per me ...

+0

Loro "perché" parte è un duplicato di http://stackoverflow.com/questions/1434842/is-there-any-wisdom-behide-and-or-operator-in-ruby, e la parte che cosa è un duplicare di http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned-about –

risposta

30

Gli operatori && e and hanno precedenza diversa e = si trova in mezzo.

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> 

Il primo viene letto come (i = true) and false, il secondo come i = (true && false).

+0

thnx! non mi rendevo conto che c'era una differenza tra && e e, lo leggerò. – alex

+3

È uno strano capriccio del linguaggio Ruby. Ho incontrato questo avvertimento in un articolo "Ruby per Python programmatori" ieri, nel mio primo giorno di apprendimento di Ruby :) – Thomas

+0

lo trovo strano non ho mai riscontrato questo problema prima perché uso questo tipo di affermazioni tutto il tempo. Devo tornare indietro e rivedere una tonnellata di codice ora :( – alex

13

and ha la precedenza inferiore rispetto = così i = true and false viene analizzato come (i = true) and false.

Quindi il valore true è assegnato ad i e quindi il valore di ritorno di tale operazione (che è vero) è and ED con falsa, che fa sì che l'intera espressione da valutare per false, anche se i ha ancora il valore true.

3

La linea viene analizzato come

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

E naturalmente a causa di i = true, i sarà true dopo.

3

quanto ho capito il tuo codice, viene interpretato come:

  • Assegna fedele i
  • ritorno ho e falso

I risultati sembra corretto.

1

Come altri hanno già chiarito sopra, la parola chiave and viene utilizzato quando si vuole mettere due diversidichiarazioni su una sola riga. È solo un modo migliore per rendere leggibile il tuo codice.

Così,

i = true and false

implica

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

o che è il modo più semplice:

 

i = true 
false 

Così, l'uscita è corretto. In caso contrario, se ti aspettavi false, quindi utilizzare il booleano e&&.

+0

grazie, è bello saperlo! – alex

+0

Questo è strettamente errato; se la prima parte dell'istruzione viene valutata come falsa o nulla, la seconda parte non viene mai valutata. Quindi, ad esempio, 'i = false e do_some_stuff' è molto diverso da' i = false; do_some_stuff', perché se nel primo caso, 'do_some_stuff' non verrà eseguito. – philomory

Problemi correlati