Die Programmiersprache Ruby (German Edition)
Ruby-Syntax, aber sie sind keine Werte, mit denen Ruby-Programme operieren können. Das heißt, dass Ruby-Methoden nicht in derselben Weise Objekte sind wie Strings, Zahlen und Arrays. Es ist jedoch möglich, ein
Method
-Objekt zu erhalten, das eine bestimmte Methode darstellt, und wir können Methoden indirekt durch
Method
-Objekte aufrufen.
Methoden sind nicht die einzige Form von parametrisiertem ausführbarem Code in Ruby. Blöcke, die wir in „5.4 Blöcke“ vorgestellt haben, sind ausführbare Codestücke und können Parameter haben. Anders als Methoden haben Blöcke jedoch keine Namen, und sie können nur indirekt durch eine Iterator-Methode aufgerufen werden.
Blöcke sind wie Methoden keine Objekte, die Ruby manipulieren kann. Aber es ist möglich, ein Objekt zu erzeugen, das einen Block repräsentiert, und das geschieht in Ruby-Programmen tatsächlich relativ häufig. Ein
Proc
-Objekt repräsentiert einen Block. Genau wie bei einem
Method
-Objekt können wir den Code eines Blocks durch die
Proc
ausführen, die ihn darstellt. Es gibt zwei Unterarten von
Proc
-Objekten, Procs und Lambdas genannt, die ein leicht unterschiedliches Verhalten besitzen. Sowohl Procs als auch Lambdas sind eher Funktionen als Methoden, die für ein Objekt aufgerufen werden. Ein wichtiges Feature von Procs und Lambdas ist, dass sie Closures sind: Sie erhalten Zugriff auf die lokalen Variablen, die bei ihrer Definition in ihrem Gültigkeitsbereich lagen, selbst wenn die Proc oder das Lambda aus einem anderen Gültigkeitsbereich aufgerufen wird.
Methoden besitzen in Ruby eine reichhaltige und recht komplexe Syntax, und die ersten vier Abschnitte dieses Kapitels sind ihnen gewidmet. Wir beginnen mit der Erläuterung, wie man einfache Methoden definiert, und erweitern diesen einführenden Abschnitt durch drei fortgeschrittenere Abschnitte, die Methodennamen, Methodenklammern und Methodenparameter behandeln. Beachten Sie, dass ein Methodenaufruf eine Art Ausdruck ist, was weiter oben in „4.4 Methodenaufrufe“ besprochen wurde. Weitere Details über Methodenaufrufe werden in den ersten vier Abschnitten dieses Kapitels erläutert.
Nach der Behandlung der Methoden wenden wir unsere Aufmerksamkeit den Procs und Lambdas zu, erläutern, wie man sie erzeugt und aufruft, und gehen auch ins Detail, was die subtilen Unterschiede zwischen ihnen angeht. Ein separater Abschnitt behandelt den Einsatz von Procs und Lambdas als Closures. Darauf folgt ein Abschnitt über das
Method
-Objekt, das sich in vielerlei Hinsicht wie ein Lambda verhält. Das Kapitel schließt mit einer fortgeschrittenen Untersuchung der funktionalen Programmierung in Ruby.
6.1 Einfache Methoden definieren
Sie haben in diesem Buch bereits viele Methodenaufrufbeispiele gesehen, und die Methodenaufrufsyntax wurde detailliert in „4.4 Methodenaufrufe“ beschrieben. Nun wenden wir uns der Syntax zur Definition von Methoden zu. Dieser Abschnitt erläutert die Grundlagen der Methodendefinition. Danach folgen drei weitere Abschnitte, die Methodennamen, Methodenklammern und Methodenargumente detaillierter behandeln. Diese zusätzlichen Abschnitte erläutern fortgeschritteneres Material und sind sowohl für die Methodenfinition als auch für Methodenaufrufe relevant.
Methoden werden mit dem Schlüsselwort
def
definiert. Darauf folgen der Methodenname und eine optionale Liste von Parameternamen in Klammern. Der Ruby-Code, der den Methodenrumpf bildet, folgt auf die Parameterliste, und das Ende der Methode wird durch das Schlüsselwort
end
gekennzeichnet. Parameternamen können als Variablen innerhalb des Methodenrumpfs verwendet werden, und die Werte dieser benannten Parameter stammen aus den Argumenten eines Methodenaufrufs. Hier sehen Sie eine Beispielmethode:
# Methode 'factorial' mit einzelnem Parameter 'n' definieren
def factorial(n)
if n < 1 # Argumentwert auf Gültigkeit prüfen
raise "Argument muss > 0 sein"
elsif n == 1 # Wenn das Argument 1 ist
1 # dann ist der Wert des Methodenaufrufs 1.
else # Andernfalls ist die Fakultät von n
n * factorial(n-1) # n-mal die Fakultät von n-1.
end
end
Dieser Code definiert eine Methode namens
factorial
. Die Methode hat einen einzelnen Parameter namens
n
. Der Bezeichner
n
wird innerhalb des Rumpfs der Methode als Variable verwendet. Es handelt sich um eine rekursive Methode, so dass der Rumpf der Methode einen Aufruf der Methode enthält. Der Aufruf ist einfach der Name der Methode, gefolgt von dem Argumentwert in
Weitere Kostenlose Bücher