Was bedeutet der folgende Code in Ruby?
||=
Gibt es eine Bedeutung oder einen Grund für die Syntax?
Was bedeutet der folgende Code in Ruby?
||=
Gibt es eine Bedeutung oder einen Grund für die Syntax?
a ||= b
ist eine bedingter Zuweisungsoperator . Es bedeutet:
a
undefiniert ist oder falsch aus, dann bewerten Sie b
und setzen a
zum Ergebnis.a
definiert ist und als wahr bewertet wird), dann b
wird nicht ausgewertet, und es findet keine Zuweisung statt.Zum Beispiel:
a ||= nil # => nil
a ||= 0 # => 0
a ||= 2 # => 0
foo = false # => false
foo ||= true # => true
foo ||= false # => true
Verwirrenderweise sieht er ähnlich aus wie andere Zuweisungsoperatoren (z. B. +=
), verhält sich aber anders.
a += b
heißt übersetzt a = a + b
a ||= b
bedeutet grob übersetzt a || a = b
Es ist eine Kurzform für a || a = b
. Der Unterschied besteht darin, dass, wenn a
ist undefiniert, a || a = b
würde erhöhen NameError
in der Erwägung, dass a ||= b
setzt a
a b
. Diese Unterscheidung ist unbedeutend, wenn a
y b
sind beide lokale Variablen, aber es ist von Bedeutung, ob es sich um eine Getter/Setter-Methode einer Klasse handelt.
Lesen Sie weiter:
Diese Frage wurde so oft auf den Ruby-Mailinglisten und Ruby-Blogs diskutiert, dass es inzwischen sogar Threads auf der Ruby-Mailingliste gibt, deren einziger Zweck es ist, Links zu alle anderen Themen auf der Ruby-Mailing-Liste, die dieses Thema diskutieren.
Hier ist eine: Die endgültige Liste der ||= (OR Equal) Themen und Seiten
Wenn Sie wirklich wissen wollen, werfen Sie einen Blick auf Abschnitt 11.4.2.3 "Gekürzte Zuweisungen" der Entwurf einer Spezifikation für die Sprache Ruby .
In erster Näherung,
a ||= b
ist gleichbedeutend mit
a || a = b
und no gleichbedeutend mit
a = a || b
Dies ist jedoch nur eine erste Annäherung, insbesondere wenn a
ist undefiniert. Die Semantik unterscheidet sich auch je nachdem, ob es sich um eine einfache Variablenzuweisung, eine Methodenzuweisung oder eine Indizierungszuweisung handelt:
a ||= b
a.c ||= b
a[c] ||= b
werden alle unterschiedlich behandelt.
a ||= b
wird auf dieselbe Weise ausgewertet wie jede der folgenden Zeilen
a || a = b
a ? a : a = b
if a then a else a = b end
-
Andererseits,
a = a || b
wird auf dieselbe Weise ausgewertet wie jede der folgenden Zeilen
a = a ? a : b
if a then a = a else a = b end
-
Edit: Wie AJedi32 in den Kommentaren bemerkte, gilt dies nur, wenn: 1. a eine definierte Variable ist. 2. Die einmalige und zweimalige Auswertung von a führt nicht zu einem Unterschied im Programm- oder Systemzustand.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.