Die Programmiersprache Ruby (German Edition)
folgenden Methodenaufruf:
o.m=(v) # Ohne Klammern und mit Leerzeichen sieht dies wie eine Zuweisung aus!
Das heißt, der Wert
v
wird an die Methode
m=
übergeben. Diese Methode kann mit diesem Wert anfangen, was immer sie möchte. Üblicherweise überprüft sie, ob der Wert den gewünschten Typ hat und innerhalb des gewünschten Wertebereichs liegt, und speichert ihn dann in einer Instanzvariablen des Objektes. Methoden wie
m=
wird normalerweise eine Methode
m
zur Seite gestellt, die einfach den zuletzt an
m=
übergebenen Wert zurückliefert. Wir nennen
m=
eine Setter -Methode und
m
eine Getter -Methode. Wenn ein Objekt dieses Methodenpaar besitzt, sagen wir, dass es ein Attribut
m
besitzt. Attribute werden in anderen Sprachen manchmal »Eigenschaften« genannt. Mehr über Ruby-Attribute erfahren Sie in „7.1.5 Akzessoren und Attribute“ .
Auch die Wertzuweisung an Array-Elemente erfolgt durch einen Methodenaufruf. Wenn ein Objekt
o
eine Methode namens
[]=
definiert (der Methodenname besteht lediglich aus diesen drei Satzzeichen), die zwei Argumente erwartet, dann wird der Ausdruck
o[x] = y
in Wirklichkeit so ausgeführt:
o.[]=(x,y)
Hat ein Objekt eine
[]=
-Methode, die drei Argumente erwartet, dann kann es mit zwei Werten zwischen den eckigen Klammern indexiert werden. Die beiden folgenden Ausdrücke sind in diesem Fall äquivalent:
o[x,y] = z
o.[]=(x,y,z)
4.5.4 Abgekürzte Wertzuweisung
Eine abgekürzte Wertzuweisung ist eine Form der Wertzuweisung, die die Wertzuweisung mit irgendeiner anderen Operation kombiniert. Sie wird am häufigsten zur Inkrementierung von Variablen verwendet:
x += 1
+=
ist kein echter Ruby-Operator, und der obige Ausdruck ist lediglich eine Abkürzung für
x = x + 1
Die abgekürzte Wertzuweisung kann nicht mit paralleler Zuweisung kombiniert werden: Sie funktioniert nur, wenn es einen einzelnen Lvalue auf der linken und einen einzelnen Wert auf der rechten Seite gibt. Sie sollte nicht verwendet werden, wenn der Lvalue eine Konstante ist, weil sie der Konstanten erneut einen Wert zuweist und so eine Warnung verursacht. Abgekürzte Wertzuweisung kann jedoch verwendet werden, wenn der Lvalue ein Attribut ist. Die folgenden beiden Ausdrücke sind äquivalent:
o.m += 1
o.m=(o.m()+1)
Abgekürzte Wertzuweisung funktioniert sogar, wenn der Lvalue ein Array-Element ist. Diese beiden Ausdrücke sind äquivalent:
o[x] -= 2
o.[]=(x, o.[](x) - 2)
Beachten Sie, dass dieser Code
-=
statt
+=
verwendet. Wie Sie möglicherweise erwartet haben, subtrahiert der Pseudooperator
-=
seinen Rvalue von seinem Lvalue.
Neben
+=
und
-=
gibt es elf weitere Pseudooperatoren, die für die abgekürzte Wertzuweisung verwendet werden können. Sie werden in Tabelle 4.1 aufgelistet. Beachten Sie, dass sie selbst keine echten Operatoren sind, sondern lediglich Kurzfassungen für Ausdrücke, die andere Operatoren verwenden. Die Bedeutungen dieser anderen Operatoren werden weiter unten in diesem Kapitel detailliert beschrieben. Außerdem sind viele dieser anderen Operatoren als Methoden definiert, wie Sie später sehen werden. Wenn eine Klasse beispielsweise eine Methode namens
+
definiert, ändert das die Bedeutung der abgekürzten Wertzuweisung mit
+=
für sämtliche Instanzen der Klasse.
----
Das Idiom ||=
Wie zu Beginn dieses Abschnitts bemerkt wurde, besteht der häufigste Einsatz der abgekürzten Wertzuweisung darin, eine Variable mit
+=
zu inkrementieren. Außerdem werden Variablen häufig mit
-=
dekrementiert. Die anderen Pseudooperatoren werden erheblich seltener verwendet. Ein Idiom sollten Sie jedoch kennen: Angenommen, Sie schreiben eine Methode, die einige Werte berechnet, sie an ein Array anhängt und dieses Array zurückliefert. Sie möchten dem Benutzer erlauben, das Array anzugeben, an das die Ergebnisse angehängt werden sollen. Aber wenn der Benutzer das Array nicht angibt, möchten Sie ein neues, leeres Array erzeugen. Sie könnten diese Zeile verwenden:
results ||= []
Denken Sie einen Moment darüber nach. Die Langform ist
results = results || []
Wenn Sie den Operator
||
aus anderen Sprachen kennen oder seine Ruby-Version beim Vorauslesen kennengelernt haben, dann wissen Sie, dass die rechte Seite dieser Wertzuweisung den Wert von
results
ergibt, es sei denn, dieser ist
nil
oder
false
. In diesem Fall ergibt er ein neues, leeres Array. Das bedeutet, dass die hier gezeigte abgekürzte Wertzuweisung
results
unverändert lässt – außer, es ist
nil
oder
false
; in diesem Fall wird ein neues
Weitere Kostenlose Bücher