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?

761voto

Steve Bennett Punkte 97061

a ||= b ist eine bedingter Zuweisungsoperator . Es bedeutet:

  • wenn a undefiniert ist oder falsch aus, dann bewerten Sie b und setzen a zum Ergebnis.
  • Andernfalls (wenn 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:

182voto

Jörg W Mittag Punkte 349574

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.

35voto

frediy Punkte 1706

Kurze und vollständige Antwort

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.

33voto

vidang Punkte 1756

Kurz gesagt, a||=b bedeutet: Wenn a es undefined, nil or false , zuweisen b a a . Ansonsten gilt a unversehrt.

20voto

nPcomp Punkte 6837

Im Grunde genommen,

x ||= y bedeutet

wenn x einen beliebigen Wert hat, lassen Sie ihn stehen und ändern Sie den Wert nicht, sonst setzen. x a y

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