Unterschied zwischen ODER und Doppelpipe-Operator in Ruby
Das or
und ||
sind beides logische Operatoren in Ruby; Sie können aufgrund ihres ähnlichen Verhaltens verwirrend sein. Es gibt nur einen kleinen Unterschied zwischen ihnen, und in diesem Tutorial werden wir uns ansehen, wie sie sich unterscheiden und wie sie verwendet werden sollten.
Beachten Sie unbedingt, dass sie sich genauso verhalten, wenn sie in einem Ausdruck vorkommen, der keinen anderen Operator enthält. Ansonsten verhalten sie sich anders.
Wenn kein anderer Bediener beteiligt ist
Bei dieser Klassifizierung verhalten sich die beiden Operatoren gleich und geben den ersten Wahrheitswert zurück.
Beispielcode:
nil or 5
2 or 4
Ausgabe:
5
2
Beispielcode:
nil || 5
2 || 4
Ausgabe:
5
2
Beachten Sie, dass die Codes in den obigen Beispielen die Form Ausdruck
und nicht Anweisung
haben. Alles zu kombinieren, was es zu einer Aussage macht, würde zu einem unerwarteten Ergebnis führen.
Zum Beispiel ist nil or 5
ein Ausdruck, der herumgereicht werden kann, vielleicht als Argument einer Methode oder einer Variablen zugewiesen, während puts nil or 5
eine vollständige Anweisung für sich ist.
Der beste Weg, Ruby-Ausdrücke zu testen, ist die Verwendung von interactive Ruby
IRB. Es ist auf macOS vorinstalliert. Führen Sie zum Testen mit IRB die folgenden Schritte aus.
-
Terminal öffnen
-
Geben Sie
irb
ein und drücken Sie Enter. Dies zeigt eine Eingabeaufforderung -
Geben Sie Ihren Ausdruck ein, zum Beispiel
nil || 5
, und drücken Sie Enter. -
Das Ergebnis des Ausdrucks wird in der nächsten Zeile angezeigt
Wenn einige andere Bediener beteiligt sind
Unser Fokus liegt auf dem Wert von a
, nachdem wir den Code in den folgenden Beispielen ausgewertet haben.
Beispielcode:
a = nil or 5
b = 2 or 4
puts a
puts b
Ausgabe:
nil
2
Beispielcode:
a = nil || 5
b = 2 || 4
puts a
puts b
Ausgabe:
5
2
Der beste Weg, das obige Verhalten zu erklären, ist ein Blick auf die Ruby-Operatoren Rangfolgetabelle. Immer wenn ein Ausdruck aus mehreren Operatoren besteht, wie in den obigen Beispielen, müssen wir sie basierend auf ihrem Vorrang auswerten.
Die Tabelle zeigt, dass der Operator =
eine höhere Priorität hat als der Operator or
, aber niedriger ist als der Operator ||
Operator. Daher kann die Reihenfolge der Bewertung in den Beispielen wie unten gezeigt aufgeschlüsselt werden.
(a = nil) or 5
(b = 2) or 4
a = (nil || 5)
b = (2 || 4)
Obwohl wir uns entschieden haben, in den obigen Beispielen den Operator =
zu verwenden, können wir jeden Operator verwenden, der höher als or
, aber kleiner als ||
ist. und das gleiche Verhalten bekommen; ein Beispiel ist +=
.
Beispielcode:
a = 1
a += 2 || 4 # a += (2 || 4)
puts a
Ausgabe:
3
Beispielcode:
a = 1
a += 2 or 4 # (a += 2) or 4
puts a
Ausgabe:
3
Beispielcode:
a = 1
a += nil || 5 # a += (nil || 5)
puts a
Ausgabe:
6
Beispielcode:
a = 1
a += nil or 5 # (a += nil) or 5
Es wird einen TypeError (nil can't be coerced into Integer)
werfen, weil Ruby versucht, zuerst den Ausdruck in der Klammer auszuwerten, indem a
um nil
erhöht wird.