2016-09-06 4 views
1

AND-Operator zweiten Wert zurück, wenn die erste Fall ist, die ersten, wenn esRubin warum 0 || 1 0

1 && 2 ---> 2 
0 && 1 ---> 0 

falsch ist, warum ODER-Verknüpfung nicht zweiten Wert zurück, wenn die erste falsch ist, aber schicken Sie die ersten, wenn es true

0 || 1 ---> 0 
1 || 0 ---> 1 
+0

'0 && 1 'kehrt' 1 ', nicht' 0 ' – Stefan

Antwort

0

Rubin nur so viel bewertet, da es wie dies in einem Ausdruck muss und stoppt dann, was Sie zurück sehen, ist nur der letzte Teil des Ausdrucks, den er bewertet hat. Also für Ihre & & Fall muss es immer bis zum Ende ausgeführt werden, falls eine spätere Klausel false zurückgibt und die AND falsch wäre.

Und tatsächlich Ihr Beispiel ist falsch:

irb> 0 && 1 
=> 1 

die seit 0 erwartet wird in Ruby, nicht so falsch wie in C.

Für die OR Fall truthy ist, kann es so schnell stoppen, wie es trifft alles, was truthig ist und muss sich nicht mit dem Rest beschäftigen.

0 || false  # => 0 
false || 0  # => 0 
false || 0 || 2 # => 0 

Wenn Sie einen Ausdruck wie diese zu einem boolean zwingen wollen, ist dies, wie Sie sehen es oft getan:

!!(expression) 
!!(0 || 1)  => true 
!!(nil || false) => false 
3

Sowohl OR als auch AND werden kurzgeschlossen, sobald sie den Wert des Ausdrucks kennen, den sie Ihnen geben. In Ruby sind sowohl 0 als auch 1 wahr, sie sind truthy Werte. So

0 || 1 is 0

weil 0 wahr ist. Nur nil || 1 oder false || 1 würde zurückgeben 1.

+0

Got es, vielen Dank – KhiemNS

+0

Gern geschehen :) – Ursus

1

|| ist ein logischer Operator, kein bitweiser Operator. Im Gegensatz zu anderen Sprachen für z.B. C ist 0 kein "falscher" Wert in Ruby.

Weil || ist ein logischer Kurzschlussoperator, haben Sie die folgende äquivalente Aussage:

definierter Wert "0" || definierter Wert "1"

Welcher Rubin wird richtig bewertet als truthy Ausdruck A || truthy Ausdruck B und truthy Ausdruck A heißt 0.

hier Siehe Rückkehr: https://gist.github.com/jfarmer/2647362

für einen guten Überblick über "truthy" und "Falsey" Werte in Python und Ruby.

0

Es gibt zwei Dinge gehen hier vor:

  1. Anders als in anderen Sprachen, in Ruby, 0 truthy ist (das heißt, sie ausgewertet wird ein in einem Booleschen Kontext wahr s).
  2. Der OR-Operator in Ruby (||) Verknüpfungen und gibt das linke Argument zurück, wenn es truthy ist.

Setzen Sie diese beiden zusammen, und Sie erhalten, dass 0 || 1 kehrt 0