Die Programmiersprache Ruby (German Edition)
alle Elemente enthält, die im linken und/oder im rechten Array vorkommen. Siehe „9.5.2.7 Arrays als Mengen“ für Details und Beispiele.
TrueClass
,
FalseClass
und
NilClass
definieren
&
,
|
und
^
(aber nicht
~
), so dass sie als Boolean-Operatoren verwendet werden können. Beachten Sie jedoch, dass dies nur selten eine gute Idee ist. Die Boolean-Operatoren
&&
und
||
(weiter unten in „4.6.8 Boolean-Operatoren: &&, ||, !, and, or, not“ beschrieben) sind für Boolean-Operanden gedacht, und sie sind effizienter, weil sie ihren rechten Operanden nicht auszuwerten brauchen, es sei denn, sein Wert beeinflusst das Ergebnis der Operation.
4.6.6 Vergleich: <, <=, >, >= und <=>
Manche Klassen definieren eine natürliche Ordnung für ihre Werte. Zahlen werden nach der Größe geordnet; Strings werden alphabetisch sortiert; Daten werden chronologisch geordnet. Die Operatoren kleiner als (
<
), kleiner oder gleich (
<=
), größer oder gleich (
>=
) und größer als (
>
) stellen Behauptungen über die relative Reihenfolge zweier Werte auf. Sie ergeben
true
, wenn die Behauptung wahr ist, und andernfalls
false
. (Und sie lösen normalerweise eine Ausnahme aus, wenn ihre Argumente inkompatiblen Typen angehören.)
Klassen können die Vergleichsoperatoren einzeln definieren. Es ist jedoch einfacher und gängiger, dass eine Klasse den einzelnen Operator
<=>
definiert. Dies ist ein Allzweck-Vergleichsoperator, und sein Rückgabewert gibt die relative Reihenfolge der beiden Operanden an. Ist sein linker Operand kleiner als der rechte, gibt
<=>
den Wert
−1
zurück. Wenn der linke Operand größer ist, wird
+1
zurückgegeben. Wenn die beiden Operanden gleich sind, gibt der Operator
0
zurück. Und wenn die beiden Operanden nicht vergleichbar sind, gibt er
nil
zurück. [ 14 ] Sobald der Operator
<=>
definiert ist, braucht eine Klasse nur noch das Modul
Comparable
zu importieren, das die anderen Vergleichsoperatoren (einschließlich des Operators
==
) anhand von
<=>
definiert.
Die Klasse
Module
verdient spezielle Erwähnung: Sie implementiert die Vergleichsoperatoren, um Unterklassenbeziehungen anzuzeigen (
Module
ist die Oberklasse von
Class
). Für die Klassen
A
und
B
ist
A < B true
, wenn
A
eine Unterklasse oder ein Nachkomme von
B
ist. In diesem Fall bedeutet »kleiner als« soviel wie »ist spezialisierter als« oder »ist ein engerer Typ als«. So können Sie sich auch merken, dass das Zeichen
<
auch zur Deklaration einer Unterklasse verwendet wird (wie wir in Kapitel 7 lernen werden):
# A als Unterklasse von B definieren
class A < B
end
Module
definiert
>
so, dass es wie
<
mit umgekehrten Operanden funktioniert. Und
<=
und
>=
werden so definiert, dass sie auch dann
true
zurückgeben, wenn die beiden Operanden dieselbe Klasse sind. Das Interessanteste an diesem
Module
-Vergleich ist, dass
Module
nur eine Teilreihenfolge für seine Werte definiert. Betrachten Sie die Klassen
String
und
Numeric
. Beide sind Unterklassen von
Object
, und keine von ihnen ist eine Unterklasse der anderen. In diesem Fall, also wenn die beiden Operanden nicht miteinander verwandt sind, geben die Vergleichsoperatoren
nil
statt
true
oder
false
zurück:
String < Object # true: String ist spezialisierter als Object.
Object > Numeric # true: Object ist allgemeiner als Numeric.
Numeric < Integer # false: Numeric ist nicht spezialisierter als Integer.
String < Numeric # nil: String und Numeric sind nicht verwandt.
Wenn eine Klasse eine vollständige Reihenfolge für ihre Werte definiert und
a < b
nicht
true
ist, dann können Sie sicher sein, dass
a >= b true
ist . Aber wenn eine Klasse wie
Module
nur eine Teilreihenfolge definiert, dürfen Sie diese Annahme nicht machen.
4.6.7 Gleichheit: ==, !=, =~, !~ und ===
==
ist der Gleichheitsoperator. Er bestimmt anhand der Definition des linken Operanden von »gleich«, ob zwei Werte gleich sind. Der Operator
!=
ist einfach die Umkehrung von
==
: Er ruft
==
auf und gibt dann das Gegenteil zurück. Sie können
!=
in Ruby 1.9, aber nicht in Ruby 1.8 neu definieren. Siehe „3.8.5 Objektgleichheit“ für eine detailliertere Diskussion über Objektgleichheit in Ruby.
=~
ist der Mustervergleichsoperator.
Object
definiert diesen Operator so, dass er immer
false
zurückliefert.
String
definiert ihn so, dass er einen
Regexp
als rechtes Argument erwartet. Und
Regexp
definiert den Operator entsprechend so, dass er einen
String
als rechtes Argument erwartet. Beide Operatoren liefern
nil
zurück, wenn der String
Weitere Kostenlose Bücher