Die Programmiersprache Ruby (German Edition)
Kopie des Objekts zurück, für das sie aufgerufen wurde, während diejenige mit Ausrufezeichen eine Mutatormethode ist, die das Objekt selbst verändert. Die Klasse
Array
definiert beispielsweise die Methoden
sort
und
sort!
.
Zusätzlich zu diesen Sonderzeichen am Ende von Methodennamen werden Sie auch am Anfang von Variablennamen welche finden: Globale Variablen beginnen mit
$
, Instanzvariablen haben das Präfix
@
und Klassenvariablen
@@
. Es kann ein wenig dauern, sich an diese Präfixe zu gewöhnen, aber nach einiger Zeit werden Sie die Tatsache zu schätzen wissen, dass das Präfix Ihnen den Gültigkeitsbereich der Variablen mitteilt. Die Präfixe werden benötigt, um Rubys sehr flexible Grammatik von Mehrdeutigkeiten zu befreien. Man kann Variablenpräfixe auch als den Preis betrachten, den wir zahlen müssen, um Klammern bei den Methodenaufrufen zu vermeiden.
1.1.7 Reguläre Ausdrücke und Bereiche
Weiter oben haben wir Arrays und Hashes als grundlegende Datenstrukturen in Ruby erwähnt. Auch den Einsatz von Zahlen und Strings haben wir demonstriert. Zwei weitere Datentypen sollten hier noch erwähnt werden. Ein
Regexp
-Objekt ( regular expression , zu Deutsch »regulärer Ausdruck«) beschreibt ein Textmuster und besitzt Methoden, um zu überprüfen, ob ein gegebener String diesem Muster entspricht oder nicht. Und ein
Range
(Bereich) stellt die Werte (üblicherweise Integer) zwischen zwei Endpunkten dar. Reguläre Ausdrücke und Bereiche besitzen in Ruby eine Literalsyntax:
/[Rr]uby/ # Passt auf "Ruby" oder "ruby"
/\d{5}/ # Passt auf 5 aufeinanderfolgende Ziffern
1..3 # Alle x, für die 1 <= x <= 3 gilt
1...3 # Alle x, für die 1 <= x < 3 gilt
Regexp
- und
Range
-Objekte definieren den normalen
==
-Operator zum Testen der Gleichheit. Zusätzlich definieren sie auch den Operator
===
zum Prüfen auf Übereinstimmung und Mitgliedschaft. Die Ruby-Anweisung
case
(die der
switch
-Anweisung in C und Java ähnelt) vergleicht ihren Ausdruck mithilfe von
===
mit jedem der möglichen Fälle, so dass dieser Operator oft als case-Vergleichsoperator bezeichnet wird. Er führt Bedingungsprüfungen wie diese durch:
# Generationsnamen nach Geburtsjahr
# Case-Ausdruck prüft Bereiche mit ===
generation = case birthyear
when 1946..1963: "Baby-Boomer"
when 1964..1976: "Generation X"
when 1978..2000: "Generation Y"
else nil
end
# Eine Methode, um den Benutzer um Zustimmung zu bitten
def are_you_sure? # Eine Methode definieren. Fragezeichen beachten!
while true # Schleife bis zum expliziten return
print "Sind Sie sicher? [j/n]: " # Dem Benutzer eine Frage stellen
response = gets # Antwort einlesen
case response # case-Bedingungsprüfung starten
when /^[jJ]/ # Wenn die Antwort mit j oder J beginnt,
return true # true für die Methode zurückgeben
when /^[nN]/, /^$/ # Wenn die Antwort mit n oder N beginnt oder leer ist,
return false # false zurückgeben
end
end
end
1.1.8 Klassen und Module
Eine Klasse ist eine Sammlung miteinander verbundener Methoden, die mit dem Zustand eines Objekts arbeiten. Der Zustand eines Objekts wird in seinen Instanzvariablen gespeichert: Variablen, deren Namen mit
@
beginnen und deren Werte spezifisch zu diesem bestimmten Objekt gehören. Der folgende Code definiert eine Beispielklasse namens
Sequence
und demonstriert, wie man Iteratormethoden schreibt und Operatoren definiert:
#
# Diese Klasse repräsentiert eine Sequenz von Zahlen, die durch die drei
# Parameter from, to und by charakterisiert wird. Die Zahlen x in der
# Sequenz gehorchen den beiden folgenden Beschränkungen:
#
# from <= x <= to
# x = from + n*by, wobei n ein Integer ist
#
class Sequence
# Dies ist eine Aufzählungsklasse;
# sie definiert unten einen each-Iterator.
include Enumerable # Die Methoden dieses Moduls in die Klasse importieren
# Die Methode initialize hat die Besonderheit, dass sie automatisch
# aufgerufen wird, um neu erzeugte Instanzen der Klasse zu initialisieren
def initialize(from, to, by)
# Unsere Parameter einfach für später in Instanzvariablen speichern
@from, @to, @by = from, to, by # Beachten: Parallelzuweisung und @-Präfix
end
# Dies ist der Iterator, den das Modul Enumerable benötigt
def each
x = @from # Am Startpunkt beginnen
while x <= @to # Solange wir das Ende nicht erreicht haben,
yield x # x an den mit dem Iterator verknüpften Block übergeben
x += @by # Inkrement von x
end
end
# length-Methode (wie Arrays) definieren, um die Anzahl der
# Werte in der
Weitere Kostenlose Bücher