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?
Um genau zu sein, a ||= b
bedeutet "wenn a
undefiniert oder fehlerhaft ist ( false
ou nil
), setzen a
a b
und auswerten zu (d.h. zurückgeben) b
, sonst ergibt sich a
".
Andere versuchen oft, dies mit folgenden Worten zu illustrieren a ||= b
ist gleichbedeutend mit a || a = b
ou a = a || b
. Diese Äquivalenzen können für das Verständnis des Konzepts hilfreich sein, aber es ist zu beachten, dass sie no unter allen Bedingungen genau. Erlauben Sie mir, das zu erklären:
a ||= b
a || a = b
?
Das Verhalten dieser Anweisungen unterscheidet sich, wenn a
eine undefinierte lokale Variable ist. In diesem Fall, a ||= b
wird eingestellt a
a b
(und bewerten nach b
), während a || a = b
wird erhöhen NameError: undefined local variable or method 'a' for main:Object
.
a ||= b
a = a || b
?
Die Gleichwertigkeit dieser Aussagen wird häufig angenommen, da eine ähnliche Gleichwertigkeit auch für andere abgekürzte Zuordnung Betreiber (d.h. +=
, -=
, *=
, /=
, %=
, **=
, &=
, |=
, ^=
, <<=
y >>=
). Allerdings ist für ||=
das Verhalten dieser Aussagen Mai sich unterscheiden, wenn a=
ist eine Methode für ein Objekt und a
ist wahrheitsgemäß. In diesem Fall, a ||= b
wird nichts tun (außer die Auswertung nach a
), während a = a || b
wird anrufen a=(a)
en a
den Empfänger. Unter andere darauf hingewiesen haben, kann dies einen Unterschied machen, wenn man a=a
hat Nebeneffekte, wie das Hinzufügen von Schlüsseln zu einem Hash.
a ||= b
a = b unless a
??
Das Verhalten dieser Anweisungen unterscheidet sich nur darin, was sie auswerten, wenn a
ist wahrheitsgemäß. In diesem Fall, a = b unless a
wird bewertet zu nil
(obwohl a
immer noch nicht gesetzt wird, wie erwartet), während a ||= b
wird bewertet zu a
.
a ||= b
defined?(a) ? (a || a = b) : (a = b)
????
Immer noch nicht. Diese Aussagen können sich unterscheiden, wenn ein method_missing
Methode existiert, die einen Wahrheitswert für a
. In diesem Fall, a ||= b
wird zu dem ausgewertet, was method_missing
zurückkehrt, und nicht versucht, die a
in der Erwägung, dass defined?(a) ? (a || a = b) : (a = b)
wird eingestellt a
a b
und bewerten nach b
.
Okay, okay, also was est a ||= b
gleichwertig zu? Gibt es eine Möglichkeit, dies in Ruby auszudrücken?
Nun, wenn ich nichts übersehe, glaube ich, dass a ||= b
ist funktionell äquivalent zu... ( Trommelwirbel )
begin
a = nil if false
a || a = b
end
Festhalten! Ist das nicht nur das erste Beispiel mit einem Noop davor? Nun, nicht ganz. Erinnern Sie sich daran, wie ich zuvor sagte, dass a ||= b
ist nur nicht gleichwertig mit a || a = b
wenn a
eine undefinierte lokale Variable ist? Nun, a = nil if false
gewährleistet, dass a
ist nie undefiniert, auch wenn diese Zeile nie ausgeführt wird. Lokale Variablen in Ruby sind lexikalisch skaliert.
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.