Die Programmiersprache Ruby (German Edition)
der Ausdruck
o[x]=y
zu
o.[]=(x,y)
, und
o[x,y]=z
wird zu
o.[]=(x,y,z)
.
Weiter unten in diesem Kapitel werden wir sehen, dass viele Ruby-Operatoren als Methoden definiert sind und dass Ausdrücke wie
x+y
als
x.+(y)
ausgewertet werden, wobei der Methodenname
+
ist. Die Tatsache, dass viele Ruby-Operatoren als Methoden definiert sind, hat zur Folge, dass Sie diese Operatoren in Ihren eigenen Klassen neu definieren können.
Betrachten wir nun diesen einfachen Ausdruck:
x
Wenn eine Variable namens
x
existiert (das heißt, wenn der Ruby-Interpreter eine Wertzuweisung für
x
gelesen hat), dann ist dies ein Variablenreferenzausdruck. Falls keine solche Variable existiert, handelt es sich um einen Aufruf der Methode
x
ohne Argumente für
self
.
Das Ruby-Schlüsselwort
super
ist ein besonderer Methodenaufrufausdruck. Dieses reservierte Wort wird verwendet, wenn eine Unterklasse einer anderen Klasse erzeugt wird. Für sich allein übergibt
super
die Argumente der aktuellen Methode an die gleichnamige Methode der Elternklasse. Das Schlüsselwort kann auch verwendet werden, als sei es der Name einer echten Methode, und eine beliebig lange Argumentliste enthalten. Das Schlüsselwort
super
wird detailliert in „7.3.3 Erweitertes Verhalten durch Verkettung“ behandelt.
4.5 Wertzuweisung
Ein Wertzuweisungsausdruck legt einen oder mehrere Werte für einen oder mehrere Lvalues fest. Lvalue ist der Name für etwas, das auf der linken Seite eines Wertzuweisungsoperators stehen kann. (Werte auf der rechten Seite eines Wertzuweisungsoperators heißen im Unterschied dazu manchmal Rvalues .) Variablen, Konstanten, Attribute und Array-Elemente sind in Ruby Lvalues. Die Regeln für Zuweisungsausdrücke und ihre Bedeutung sind für verschiedene Arten von Lvalues etwas unterschiedlich, und jede dieser Arten wird in diesem Abschnitt detailliert erläutert.
Es gibt in Ruby drei verschiedene Formen von Wertzuweisungsausdrücken. Einfache Zuweisungsausdrücke umfassen einen Lvalue, den Operator
=
und einen Rvalue. Zum Beispiel:
x = 1 # Den Lvalue x auf den Wert 1 setzen.
Abgekürzte Wertzuweisung ist ein kurz gefasster Ausdruck, der den Wert einer Variablen durch die Anwendung einer anderen Operation (etwa einer Addition) auf den derzeitigen Wert der Variablen aktualisiert. Abgekürzte Wertzuweisung verwendet Zuweisungsoperatoren wie
+=
und
*=
, die binäre Operatoren mit einem Gleichheitszeichen kombinieren:
x += 1 # Den Lvalue x auf den Wert x + 1 setzen.
Parallele Wertzuweisung schließlich ist jeder Wertzuweisungsausdruck, der mehr als einen Lvalue oder mehr als einen Rvalue enthält. Hier ein einfaches Beispiel:
x,y,z = 1,2,3 # x auf 1, y auf 2 und z auf 3 setzen.
Parallele Wertzuweisung ist komplizierter, wenn die Anzahl der Lvalues nicht identisch mit der Anzahl der Rvalues ist oder wenn rechts ein Array steht. Die vollständigen Details folgen.
Der Wert eines Wertzuweisungsausdrucks ist der Wert (oder ein Array von Werten), die zugewiesen werden. Außerdem ist der Zuweisungsoperator »rechts-assoziativ« – wenn mehrere Wertzuweisungen in einer einzelnen Anweisung stehen, werden sie von rechts nach links ausgewertet. Das bedeutet, dass die Wertzuweisung verkettet werden kann, um mehreren Variablen denselben Wert zuzuweisen:
x = y = 0 # x und y auf 0 setzen.
Beachten Sie, dass dies kein Fall paralleler Wertzuweisung ist – es sind zwei einfache Wertzuweisungen, die verkettet werden:
y
wird der Wert
0
zugewiesen, und dann wird
x
der Wert (ebenfalls
0
) dieser ersten Wertzuweisung zugewiesen.
----
Wertzuweisung und Nebenwirkungen
Wichtiger als der Wert eines Zuweisungsausdrucks ist die Tatsache, dass Wertzuweisungen den Wert einer Variablen (oder eines anderen Lvalue) setzen und so den Programmzustand beeinflussen. Diese Auswirkung auf den Programmzustand wird Nebenwirkung der Zuweisung genannt.
Viele Ausdrücke haben keine Nebenwirkungen und beeinflussen den Programmzustand nicht. Sie sind idempotent . Das bedeutet, dass der Ausdruck immer wieder von Neuem ausgewertet werden kann und jedes Mal denselben Wert zurückgibt. Und es bedeutet, dass die Auswertung des Ausdrucks keine Auswirkungen auf den Wert anderer Ausdrücke hat. Hier sehen Sie zwei Ausdrücke ohne Nebenwirkungen:
x + y
Math.sqrt(2)
Es ist wichtig zu verstehen, dass Wertzuweisungen nicht idempotent sind:
x = 1 # Beeinflusst den Wert anderer Ausdrücke, die x verwenden.
x += 1 # Gibt bei jeder Auswertung einen anderen Wert zurück.
Einige Methoden,
Weitere Kostenlose Bücher