Die Programmiersprache Ruby (German Edition)
Mitgliedschaft.
Mit diesem Hintergrundwissen können wir die Range-Methoden zum Prüfen auf Zugehörigkeit beschreiben. Ruby 1.8 unterstützt die zwei Methoden,
include?
und
member?
. Sie sind Synonyme, und beide verwenden die kontinuierliche Zugehörigkeitsprüfung:
r = 0...100 # Der Bereich der Integer zwischen 0 und 99
r.member? 50 # => true: 50 ist Element des Bereichs
r.include? 100 # => false: 100 ist aus dem Bereich ausgeschlossen
r.include? 99.9 # => true: 99.9 ist kleiner als 100
In Ruby 1.9 ist die Situation anders. Diese Version der Sprache führt eine neue Methode namens
cover?
ein, die wie
include?
und
member?
in Ruby 1.8 funktioniert: Sie verwendet stets die Prüfung auf kontinuierliche Mitgliedschaft.
include?
und
member?
sind auch in Ruby 1.9 weiterhin Synonyme. Wenn die Endpunkte des Bereichs Zahlen sind, verwenden diese Methoden die kontinuierliche Zugehörigkeitsprüfung, genau wie in Ruby 1.8. Sind die Endpunkte dagegen nicht numerisch, verwenden sie stattdessen die diskrete Zugehörigkeitsprüfung. Wir können diese Änderungen an einem diskreten Bereich von Strings demonstrieren (Sie sollten ri verwenden, um zu verstehen, wie
String.succ
funktioniert):
triples = "AAA".."ZZZ"
triples.include? "ABC" # true; schnell in 1.8 und langsam in 1.9
triples.include? "ABCD" # true in 1.8, false in 1.9
triples.cover? "ABCD" # true und schnell in 1.9
triples.to_a.include? "ABCD" # false und langsam in 1.8 and 1.9
In der Praxis haben die meisten Bereiche numerische Endpunkte, so dass die Änderungen der
Range
-API zwischen Ruby 1.8 und 1.9 nur geringfügige Auswirkungen haben.
3.6 Symbole
Die typische Implementierung eines Ruby-Interpreters verwaltet eine Symboltabelle, in der sie die Namen aller Klassen, Methoden und Variablen speichert, die sie kennt. Das ermöglicht es einem solchen Interpreter, die meisten String-Vergleiche zu vermeiden: Der Verweis auf Methodennamen (zum Beispiel) erfolgt anhand ihrer Position in dieser Symboltabelle. Dies ersetzt einen relativ aufwändigen String-Vergleich durch eine relativ günstige Integer-Operation.
Diese Symbole existieren nicht nur absolut intern für den Interpreter, sondern können auch von Ruby-Programmen verwendet werden. Ein
Symbol
-Objekt verweist auf ein Symbol. Ein Symbol-Literal wird geschrieben, indem ein Bezeichner oder ein String einen Doppelpunkt als Präfix erhält:
:symbol # Ein Symbol-Literal
:"symbol" # Dasselbe Literal
:'another long symbol' # Anführungszeichen für Symbole mit Leerzeichen
s = "string"
sym = :"#{s}" # Das Symbol :string
Für Symbole gibt es außerdem die
%s
-Literal-Syntax, die beliebige Begrenzungszeichen erlaubt, genau wie
%q
and
%Q
bei String-Literalen:
%s["] # Dasselbe wie :'"'
Symbole werden oft verwendet, um in reflektivem Code auf Methodennamen zu verweisen. Angenommen beispielsweise, wir möchten wissen, ob irgendein Objekt eine
each
-Methode besitzt:
o.respond_to? :each
Hier ein weiteres Beispiel. Es überprüft, ob ein gegebenes Objekt auf eine angegebene Methode reagiert, und falls ja, wird diese Methode aufgerufen:
name = :size
if o.respond_to? name
o.send(name)
end
Sie können einen
String
mithilfe der Methoden
intern
oder
to_sym
in ein
Symbol
konvertieren. Und Sie können ein
Symbol
mithilfe der Methode
to_s
oder mit ihrem Alias
id2name
zurück in einen
String
konvertieren.
str = "string" # Mit einem String beginnen
sym = str.intern # In ein Symbol konvertieren
sym = str.to_sym # Eine andere Möglichkeit, dasselbe zu tun
str = sym.to_s # In einen String zurückkonvertieren
str = sym.id2name # Eine andere Möglichkeit dafür
Zwei Strings können denselben Inhalt enthalten und dennoch zwei völlig verschiedene Objekte sein. Bei Symbolen ist dies nie der Fall. Zwei Strings mit demselben Inhalt werden beide in genau dasselbe
Symbol
-Objekt konvertiert.
Jedes Mal, wenn Sie Code schreiben, der Strings nicht wegen ihres Textinhalts verwendet, sondern als eine Art eindeutiger Bezeichner, sollten Sie stattdessen Symbole verwenden. Anstatt beispielsweise eine Methode zu schreiben, die einen der Strings »Mo« oder »So« als Argument erwartet, könnten Sie sie so schreiben, dass sie das Symbol
:Mo
oder das Symbol
:So
annimmt. Die Prüfung zweier
Symbol
-Objekte auf Gleichheit geht erheblich schneller vonstatten als diejenige von zwei Strings. Aus diesem Grund werden Symbole im Allgemeinen gegenüber Strings als Hash-Schlüssel bevorzugt.
In Ruby 1.9 definiert die Klasse
Symbol
eine Anzahl von
String
-Methoden,
Weitere Kostenlose Bücher