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 gleichbedeutend mit
a || a = b
und nicht
a = a || b
wegen der Situation, in der Sie einen Hash mit einem Standard definieren (der Hash gibt den Standard für alle nicht definierten Schlüssel zurück)
a = Hash.new(true) #Which is: {}
wenn Sie verwenden:
a[10] ||= 10 #same as a[10] || a[10] = 10
a ist still:
{}
aber wenn man es so schreibt:
a[10] = a[10] || 10
a wird:
{10 => true}
weil Sie den Wert von sich selbst als Schlüssel zugewiesen haben 10
die standardmäßig true ist, so dass der Hash jetzt für den Schlüssel 10
anstatt den Auftrag gar nicht erst auszuführen.
Das ist ein weit verbreiteter Irrglaube, a ||= b
ist nicht gleichbedeutend mit a = a || b
, aber es verhält sich wie a || a = b
.
Aber jetzt kommt ein kniffliger Fall. Wenn a
ist nicht definiert, a || a = 42
hebt NameError
, während a ||= 42
gibt zurück. 42
. Sie scheinen also keine gleichwertigen Ausdrücke zu sein.
b = 5
a ||= b
Dies bedeutet übersetzt:
a = a || b
die sein werden
a = nil || 5
also endlich
a = 5
Wenn Sie das jetzt noch einmal anrufen:
a ||= b
a = a || b
a = 5 || 5
a = 5
b = 6
Wenn Sie das jetzt noch einmal anrufen:
a ||= b
a = a || b
a = 5 || 6
a = 5
Wenn Sie beobachten, b
Wert wird nicht zugewiesen a
. a
haben noch 5
.
Es handelt sich um ein Memoization Pattern, das in Ruby zur Beschleunigung von Accessors verwendet wird.
def users
@users ||= User.all
end
Das bedeutet im Grunde genommen:
@users = @users || User.all
Wenn Sie diese Methode zum ersten Mal aufrufen, erfolgt also ein Aufruf an die Datenbank.
Künftige Aufrufe dieser Methode geben lediglich den Wert von @users
Instanzvariable.
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.