Die Programmiersprache Ruby (German Edition)
einfach ein Synonym für
equal?
, und er überprüft schlicht, ob zwei Objektreferenzen identisch sind. Die meisten Klassen definieren diesen Operator neu, um verschiedene Instanzen auf Gleichheit zu testen:
a = "Ruby" # Ein String-Objekt
b = "Ruby" # Ein anderes String-Objekt mit demselben Inhalt
a.equal?(b) # false: a und b verweisen nicht auf dasselbe Objekt
a == b # true: Aber die beiden verschiedenen Objekte haben denselben Wert
Beachten Sie, dass das einzelne Gleichheitszeichen in diesem Code der Wertzuweisungsoperator ist. Um Gleichheit zu überprüfen, werden in Ruby zwei Gleichheitszeichen benötigt (diese Konvention teilt Ruby mit vielen anderen Programmiersprachen).
Die meisten Ruby-Standardklassen definieren den Operator
==
als vernünftige Definition von Gleichheit. Das umfasst die Klassen
Array
und
Hash
. Zwei Arrays sind gemäß dem Operator
==
gleich, wenn sie dieselbe Anzahl von Elementen besitzen und all ihre korrespondierenden Elemente gemäß
==
gleich sind. Zwei Hashes sind
==
, wenn sie dieselbe Anzahl von Schlüssel/Wert-Paaren enthalten, und wenn die Schlüssel und Werte selbst identisch sind. (Werte werden mithilfe des Operators
==
verglichen, Hash-Schlüssel dagegen mithilfe der weiter unten in diesem Kapitel beschriebenen Methode
eql?
.)
----
Gleichheit für Java-Programmierer
Wenn Sie Java-Programmierer sind, sind Sie es gewohnt, den Operator
==
zu verwenden, um zu prüfen, ob zwei Objekte dasselbe Objekt sind, und die Methode
equals
, um zu überprüfen, ob zwei verschiedene Objekte denselben Wert haben. Die Ruby-Konvention ist ungefähr das Gegenteil derjenigen von Java.
----
Die
Numeric
-Klassen führen in ihren
==
-Operatoren einfache Typkonvertierungen durch, so dass (beispielsweise) die
Fixnum 1
und die
Float 1.0
als gleich gelten. Der
==
-Operator von Klassen wie etwa
String
und
Array
erfordert normalerweise, dass beide Operanden derselben Klasse angehören. Wenn der rechte Operand eine
to_str
oder
to_ary
-Funktion definiert (siehe „3.8.7 Objektkonvertierung“ ), dann rufen diese Operatoren den vom rechten Operanden definierten
==
-Operator auf und lassen dieses Objekt entscheiden, ob es mit dem linken String beziehungsweise Array identisch ist. Deshalb ist es möglich (wenn auch nicht üblich), Klassen mit String- oder Array-ähnlichem Vergleichsverhalten zu definieren.
!=
(»ungleich«) wird in Ruby verwendet, um auf Ungleichheit zu testen. Wenn Ruby
!=
sieht, wird einfach der
==
-Operator verwendet und das Ergebnis umgekehrt. Das bedeutet, dass eine Klasse für ihre eigene Definition von Gleichheit lediglich den
==
-Operator zu definieren braucht. Ruby liefert den Operator
!=
kostenlos mit. In Ruby 1.9 können Klassen allerdings auch explizit ihren eigenen
!=
-Operator definieren.
3.8.5.3 Die Methode eql?
Die Methode
eql?
wird von
Object
als Synonym für
equal?
definiert. Klassen, die diese Methode überschreiben, verwenden sie für gewöhnlich als strenge Version von
==
, die keine Typkonvertierung durchführt. Zum Beispiel:
1 == 1.0 # true: Fixnum- und Float-Objekte können == sein
1.eql?(1.0) # false: Aber sie sind niemals eql!
Die Klasse
Hash
verwendet
eql?
, um zu überprüfen, ob zwei Hash-Schlüssel identisch sind. Wenn zwei Objekte
eql?
sind, müssen auch ihre
hash
-Methoden denselben Wert zurückgeben. Wenn Sie eine Klasse erzeugen und den Operator
==
definieren, können Sie in der Regel einfach eine
hash
-Methode schreiben und die Methode
eql?
so definieren, dass sie
==
verwendet.
3.8.5.4 Der Operator ===
Der Operator
===
wird üblicherweise als Case-Vergleichsoperator bezeichnet, denn er wird verwendet, um zu prüfen, ob der Zielwert einer
case
-Anweisung irgendeiner der
when
-Klauseln dieser Anweisung entspricht. (Die
case
-Anweisung ist eine Mehrwegverzweigung und wird in Kapitel 5 erläutert.)
Object
definiert einen Standard-
===
-Operator, der den Operator
==
aufruft. Für viele Klassen ist Case-Gleichheit daher dasselbe wie
==
-Gleichheit. Aber bestimmte wichtige Klassen definieren
===
anders, und in diesen Fällen entspricht es eher einem Zugehörigkeits- oder Mustervergleichsoperator.
Range
definiert
===
als Prüfung, ob ein Wert innerhalb des Bereichs liegt.
Regexp
definiert
===
als Prüfung, ob ein String dem regulären Ausdruck entspricht. Und
Class
definiert
===
als Prüfung, ob ein Objekt eine Instanz der jeweiligen Klasse ist. In Ruby 1.9 definiert
Symbol ===
so, dass
true
zurückgegeben wird, wenn der rechte Operand dasselbe Symbol ist
Weitere Kostenlose Bücher