2010-05-10 17 views
13

Bin ich Ruby hier grundsätzlich falsch? Ich habe Code Rubin geschrieben für ca. 2 Jahre jetzt und nur auf diese heute gestolpert ...i = wahr und falsch in Ruby ist wahr?

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

Könnte jemand erklären, was hier vor sich geht, bitte? Ich bin sicher, dass es spec ist, aber es scheint nur unlogisch mir ...

+0

Sie "warum" Teil ist ein Duplikat von http://stackoverflow.com/questions/1434842/is-there-any-whisdom-behide-and-or-operator-in-ruby, und was ist ein Teil Duplikat von http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned-about –

Antwort

30

Die Operatoren && und and haben unterschiedliche Priorität, und = ist zufällig dazwischen.

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> 

Die erste wird als (i = true) and false, die zweite als i = (true && false) lesen.

+0

thnx! Ich wusste nicht, dass es einen Unterschied zwischen && und und gab, ich werde darüber nachlesen. – alex

+3

Es ist eine seltsame Eigenart der Ruby-Sprache. Ich traf diese Einschränkung in einem "Ruby for Python Programmierer" Artikel gestern, an meinem ersten Tag des Lernens Ruby :) – Thomas

+0

Ich finde es seltsam, ich habe dieses Problem noch nie zuvor begegnet, weil ich diese Art von Aussagen die ganze Zeit verwenden. Ich muss zurückgehen und eine Tonne Code jetzt überprüfen :( – alex

13

and hat eine geringere Priorität als = so i = true and false als (i = true) and false analysiert wird.

So wird der Wert true wird i zugewiesen und dann der Rückgabewert dieser Operation (was wahr ist) ist and ed mit falschen, die der ganze Ausdruck führt zu false, auch zu bewerten, obwohl i noch den Wert true hat.

3

Ihre Linie wird als

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

Und natürlich wegen i = true, itrue danach sein wird.

3

Wie ich Ihren Code zu verstehen, wird es interpretiert als:

  • Assign treu i
  • Return i und falsche

Die Ergebnisse richtig zu sein scheint.

1

Wie andere oben erläutert haben, das Schlüsselwort and verwendet, wenn Sie zwei verschiedeneAussagen auf einer Zeile setzen wollen. Es ist nur eine bessere Möglichkeit, Ihren Code lesbar zu machen. So

,

i = true and false

impliziert

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

oder welche ist die einfachste Art und Weise:

 

i = true 
false 

So wird die Ausgabe korrekt ist. Wenn Sie andernfalls false erwartet haben, verwenden Sie den booleschen Wert und&&.

+0

Danke, das ist gut zu wissen! – alex

+0

Dies ist streng genommen falsch; Wenn der erste Teil der Anweisung zu false oder nil ausgewertet wird, wird der zweite Teil überhaupt nicht ausgewertet. So ist zum Beispiel "i = false und do_some_stuff" sehr verschieden von "i = false; do_some_stuff', denn wenn "do_some_stuff" ausgeführt wird, wird "do_some_stuff" nicht ausgeführt. – philomory