Die Programmiersprache Ruby (German Edition)
der Zahlennamen mit Ziffern verknüpft
:eins => 1, # Die "Pfeile" zeigen Zuordnungen an: Schlüssel =>
# Wert
:zwei => 2 # Doppelpunkte kennzeichnen Symbolliterale
}
h[:eins] # => 1: Zugriff auf einen Wert durch den Schlüssel
h[:drei] = 3 # Neues Schlüssel/Wert-Paar zum Hash hinzufügen
h.each do |key,value| # Über die Schlüssel/Wert-Paare iterieren
print "#{value}:#{key}; " # Variablensubstitution im String
end # Gibt "1:eins; 2:zwei; 3:drei; " aus
Ruby-Hashes können beliebige Objekte als Schlüssel verwenden, aber Symbolobjekte werden am häufigsten eingesetzt. Symbole sind unveränderliche, interne Strings. Sie können anhand ihrer Identität anstatt anhand ihres Textinhalts verglichen werden (da zwei verschiedene Symbolobjekte niemals denselben Inhalt haben).
Die Fähigkeit, einen Codeblock mit einem Methodenaufruf zu verknüpfen, ist ein grundlegendes und sehr mächtiges Feature von Ruby. Der nächstliegende Verwendungszweck sind zwar schleifenartige Konstrukte, aber selbst für Methoden, die den Block nur einmal aufrufen, kann darin Nutzen liegen. Zum Beispiel:
File.open("data.txt") do |f| # Datei öffnen und Datenstrom an Block übergeben
line = f.readline # Datenstrom verwenden, um aus der Datei zu lesen
end # Datenstrom wird am Ende des Blocks automatisch
# geschlossen
t = Thread.new do # Diesen Block in einem neuen Thread ausführen
File.read("data.txt") # Eine Datei im Hintergrund einlesen
end # Dateiinhalt als Thread-Wert verfügbar
Beachten Sie zusätzlich, dass das
Hash.each
-Beispiel weiter oben die folgende interessante Codezeile enthielt:
print "#{value}:#{key}; " # Variablensubstitution im String
Strings in doppelten Anführungszeichen können beliebige Ruby-Ausdrücke enthalten, die von
#{
und
}
umschlossen werden. Der Wert des Ausdrucks innerhalb dieser Begrenzungen wird in einen String konvertiert (mithilfe seiner
to_s
-Methode, die von allen Objekten unterstützt wird). Danach wird der Ergebnisstring verwendet, um den Ausdruckstext und seine Begrenzungen in dem String-Literal zu ersetzen. Diese Ersetzung von Ausdruckswerten in Strings wird üblicherweise String-Interpolation genannt.
1.1.3 Ausdrücke und Operatoren in Ruby
Die Ruby-Syntax ist ausdrucksorientiert. Kontrollstrukturen wie
if
, die in anderen Sprachen Anweisungen heißen, sind in Ruby eigentlich Ausdrücke. Sie haben Werte wie andere, einfachere Ausdrücke, und wir können Code wie diesen schreiben:
minimum = if x < y then x else y end
Auch wenn alle »Anweisungen« in Ruby eigentlich Ausdrücke sind, geben sie nicht unbedingt sinnvolle Werte zurück.
while
-Schleifen und Methodendefinitionen sind beispielsweise Ausdrücke, die normalerweise den Wert
nil
zurückgeben.
Wie in den meisten Sprachen werden Ausdrücke in Ruby üblicherweise aus Werten und Operatoren gebildet. Die meisten Ruby-Operatoren werden jedem vertraut sein, der C, Java, JavaScript oder irgendeine vergleichbare Programmiersprache kennt. Hier sehen Sie Beispiele für einige wohlbekannte und einige etwas ungewöhnlichere Ruby-Operatoren:
1 + 2 # => 3: Addition
1 * 2 # => 2: Multiplikation
1 + 2 == 3 # => true: == prüft auf Gleichheit
2 ** 1024 # 2 hoch 1024: Ruby besitzt Integer beliebiger Größe
"Ruby" + " rocks!" # => "Ruby rocks!": String-Verknüpfung
"Ruby! " * 3 # => "Ruby! Ruby! Ruby! ": String-Wiederholung
"%d %s" % [3, "rubies"] # => "3 rubies": printf-Formatierung im Python-Stil
max = x > y ? x : y # Der Bedingungsoperator
Viele Ruby-Operatoren sind als Methoden implementiert, und Klassen können diese Methoden definieren (oder umdefinieren), wie sie möchten. (Sie können allerdings keine vollkommen neuen Operatoren definieren; es gibt nur eine festgelegte Menge anerkannter Operatoren.) Betrachten Sie zum Beispiel die Operatoren
+
und
*
, die sich bei Integer- und String-Werten unterschiedlich verhalten. Und Sie können diese Operatoren in Ihren eigenen Klassen auf jede gewünschte Weise definieren. Der Operator
<<
ist ein weiteres gutes Beispiel. Die Integer-Klassen
Fixnum
und
Bignum
verwenden diesen Operator für die Linksverschiebung Bit für Bit, wie die Programmiersprache C. Gleichzeitig verwenden andere Klassen – etwa Strings, Arrays und Datenströme – diesen Operator für die Operation zum Anhängen von Werten (wie C++). Wenn Sie eine neue Klasse erstellen, an die man in irgendeiner Form Werte anhängen kann, ist es eine sehr gute Idee,
<<
zu definieren.
Einer der leistungsfähigsten Operatoren, die Sie überschreiben
Weitere Kostenlose Bücher