458 Stimmen

Was bedeutet ||= (oder-gleich) in Ruby?

Was bedeutet der folgende Code in Ruby?

||=

Gibt es eine Bedeutung oder einen Grund für die Syntax?

2voto

Max Rogers Punkte 914

Dies ist die Standard-Zuweisungsschreibweise

zum Beispiel: x ||= 1
wird geprüft, ob x gleich Null ist oder nicht. Wenn x tatsächlich gleich Null ist, wird ihm der neue Wert zugewiesen (in unserem Beispiel 1)

deutlicher:
wenn x == nil
x = 1
Ende

2voto

Luca Guidi Punkte 1191

Bitte denken Sie auch daran, dass ||= ist kein atomarer Vorgang und daher nicht thread-sicher. Als Faustregel gilt, dass Sie sie nicht für Klassenmethoden verwenden sollten.

2voto

RileyE Punkte 10533
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.

1voto

tessie Punkte 792

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.

1voto

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.com

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.

Powered by:

X