Die Programmiersprache Ruby (German Edition)
ausgenommen
Mit der Methode
include?
können Sie testen, ob ein Wert in einem Bereich enthalten ist (aber lesen Sie die Diskussion über Alternativen weiter unten):
cold_war = 1945..1989
cold_war.include? birthdate.year
Wenn ein Bereich die Werte zwischen zwei Endpunkten enthält, muss es natürlich eine Möglichkeit geben, Werte mit diesen Enpunkten zu vergleichen. In Ruby geschieht dies mithilfe des Vergleichsoperators
<=>
, der seine beiden Operanden miteinander vergleicht und je nach ihrer relativen Ordnungsrelation (oder Gleichheit)
−1
,
0
beziehungsweise
1
ergibt. Klassen wie etwa Zahlen und Strings, die eine Ordnungsrelation besitzen, definieren den Operator
<=>
. Ein Wert kann nur als Endpunkt eines Bereichs verwendet werden, wenn er auf diesen Operator reagiert. Die Endpunkte eines Bereichs und die Werte »im« Bereich gehören üblicherweise alle derselben Klasse an. Technisch gesehen kann allerdings jeder beliebige Wert, der zu den
<=>
-Operatoren der Bereichsendpunkte kompatibel ist, als Element des Bereichs betrachtet werden.
Der Haupteinsatzzweck von Bereichen sind Vergleiche: bestimmen zu können, ob ein Wert innerhalb oder außerhalb des Bereichs liegt. Der zweitwichtigste Verwendungszweck ist die Iteration: Wenn die Klasse der Endpunkte eines Bereichs eine
succ
-Methode (für successor , das heißt Nachfolger) definiert, dann gibt es eine klar abgegrenzte Menge von Bereichselementen, über die mithilfe von
each
,
step
und den
Enumerable
-Methoden iteriert werden kann. Betrachten Sie beispielsweise den Bereich
'a'..'c'
:
r = 'a'..'c'
r.each {|l| print "[#{l}]"} # Gibt "[a][b][c]" aus
r.step(2) { |l| print "[#{l}]"} # Gibt "[a][c]" aus
r.to_a # => ['a','b','c']: Enumerable definiert to_a
Das funktioniert, weil die Klasse
String
eine
succ
-Methode definiert;
'a'.succ
ergibt
'b'
und
'b'.succ
ergibt
'c'
. Bereiche, über die auf diese Weise iteriert werden kann, heißen diskrete Bereiche. Über Bereiche, deren Endpunkt keine
succ
-Methode definieren, kann nicht iteriert werden, so dass sie kontinuierlich genannt werden können. Beachten Sie, dass Bereiche mit Integer-Endpunkten diskret sind, während Bereiche mit Fließkommazahlen als Endpunkt kontinuierlich sind.
Bereiche mit Integer-Endpunkten werden in typischen Ruby-Programmen am häufigsten eingesetzt. Da sie diskret sind, können Integer-Bereiche zur Indexierung von Strings und Arrays verwendet werden. Sie sind auch eine bequeme Möglichkeit, eine aufzählbare Sammlung aufsteigender Werte darzustellen.
Beachten Sie, dass der Code ein Bereichsliteral einer Variablen zuweist und dann Methoden des Bereichs durch die Variable aufruft. Wenn Sie eine Methode direkt für ein Bereichs-Literal aufrufen möchten, müssen Sie das Literal in Klammern setzen, da der Methodenaufruf andernfalls für den Endpunkt des Bereichs statt für das
Range
-Objekt selbst gilt:
1..3.to_a # Versucht, to_a für die Zahl 3 aufzurufen
(1..3).to_a # => [1,2,3]
3.5.1 Zugehörigkeit zu einem Bereich prüfen
Die Klasse
Range
definiert Methoden, um zu ermitteln, ob ein beliebiger Wert Element eines Bereichs (das heißt in dem Bereich enthalten) ist. Bevor wir diese Methoden detailliert betrachten, ist es wichtig zu erläutern, dass die Bereichszugehörigkeit auf zwei verschiedene Arten definiert werden kann, was mit dem Unterschied zwischen kontinuierlichen und diskreten Bereichen zusammenhängt. Ein Wert
x
ist gemäß der ersten Definition Element des Bereichs
begin..end
, wenn gilt:
begin <= x <= end
Und
x
ist Element des Bereichs
begin...end
(mit drei Punkten), wenn gilt:
begin <= x < end
Alle Werte von Bereichsendpunkten müssen den Operator
<=>
implementieren, so dass diese Definition der Zugehörigkeit für alle
Range
-Objekte funktioniert und nicht erfordert, dass die Endpunkte die Methode
succ
implementieren. Wir nennen dies den kontinuierlichen Zugehörigkeitstest.
Die zweite Definition von Zugehörigkeit – diskrete Zugehörigkeit – hängt dagegen von
succ
ab. Sie behandelt einen
Range begin..end
als Menge, die
begin
,
begin.succ
,
begin.succ.succ
und so weiter enthält. Gemäß dieser Definition ist die Bereichszugehörigkeit eine Mengenzugehörigkeit, und ein Wert
x
ist nur dann in einem Bereich enthalten, wenn es sich um einen Wert handelt, der von einem der
succ
-Aufrufe zurückgegeben wird. Beachten Sie, dass die Prüfung auf diskrete Mitgliedschaft potenziell eine erheblich aufwändigere Operation darstellt als die Prüfung auf kontinuierliche
Weitere Kostenlose Bücher