Die Programmiersprache Ruby (German Edition)
jeweiligen Parameters verwendet. Sie legen einen Standardwert fest, indem Sie hinter dem Parameternamen ein Gleichheitszeichen und einen Wert einfügen:
def prefix(s, len=1)
s[0,len]
end
Diese Methode deklariert zwei Parameter, aber der zweite hat einen Standardwert. Das bedeutet, dass wir die Methode entweder mit einem oder mit zwei Argumenten aufrufen können:
prefix("Ruby", 3) # => "Rub"
prefix("Ruby") # => "R"
Argumentstandardwerte brauchen keine Konstanten zu sein: Sie können beliebige Ausdrücke sein und dürfen sich auf Instanzvariablen und auf zuvor definierte Parameter in der Parameterliste beziehen, zum Beispiel:
# Letztes Zeichen von s oder Teilstring vom Index bis zum Ende zurückgeben
def suffix(s, index=s.size-1)
s[index, s.size-index]
end
Parameterstandardwerte werden ausgewertet, wenn eine Methode aufgerufen wird, nicht wenn sie geparst wird. In der folgenden Methode erzeugt der Standardwert
[]
bei jedem Aufruf ein neues, leeres Array, anstatt ein einzelnes Array zu verwenden, das bei der Methodendefinition erzeugt wird:
# Wert x an Array a anfügen, a zurückgeben
# Wenn kein Array angegeben wird, ein neues erzeugen
def append(x, a=[])
a << x
end
In Ruby 1.8 müssen Methodenparameter mit Standardwerten hinter allen normalen Parametern in der Parameterliste stehen. Ruby 1.9 lockert diese Beschränkung und lässt zu, dass normale Parameter hinter Parametern mit Standardwerten stehen. Es ist immer noch notwendig, dass alle Parameter mit Standardwerten in der Parameterliste aufeinanderfolgen – beispielsweise können Sie keine zwei Parameter mit Standardwerten deklarieren, zwischen denen ein normaler Parameter liegt. Wenn eine Methode mehr als einen Parameter mit Standardwerten enthält und Sie die Methode mit Argumenten für einige, aber nicht alle dieser Parameter aufrufen, dann werden sie von links nach rechts gefüllt. Angenommen, eine Methode hat zwei Parameter, die beide Standardwerte besitzen. Wenn Sie ein Argument angeben, wird es dem ersten Parameter zugewiesen, und der zweite Parameter verwendet seinen Standardwert. Es gibt jedoch keine Möglichkeit, einen Wert für den zweiten Parameter anzugeben und den Standardwert des ersten Parameters zu verwenden.
6.4.2 Argumentlisten mit variabler Länge und Arrays
Manchmal möchten wir Methoden schreiben, die eine beliebige Anzahl von Argumenten annehmen können. Dazu setzen wir ein
*
vor einen der Parameter der Methode. Innerhalb des Rumpfs der Methode verweist dieser Parameter auf ein Array, das die null oder mehr Argumente enthält, die an dieser Stelle übergeben wurden, zum Beispiel:
# Das größte der Argumente (eins oder mehrere) zurückgeben
def max(first, *rest)
# Annahme: erstes notwendiges Argument ist das größte
max = first
# Nun über alle optionalen Argumente iterieren und evtl. größere finden
rest.each {|x| max = x if x > max }
# Den größten gefundenen Wert zurückgeben
max
end
Die Methode
max
benötigt mindestens ein Argument, aber sie kann eine beliebige Anzahl zusätzlicher Argumente annehmen. Das erste Argument steht durch den Parameter
first
zur Verfügung. Jegliche zusätzlichen Argumente werden im Array
rest
abgelegt. Wir können
max
wie folgt aufrufen:
max(1) # first=1, rest=[]
max(1,2) # first=1, rest=[2]
max(1,2,3) # first=1, rest=[2,3]
Beachten Sie, dass alle
Enumerable
-Objekte in Ruby automatisch eine
max
-Methode besitzen, so dass die hier definierte Methode nicht sonderlich nützlich ist.
Höchstens einem Parameter darf ein
*
vorangestellt werden. In Ruby 1.8 muss dieser Parameter hinter allen normalen Parametern und hinter allen Parametern mit Standardwerten stehen. Er sollte der letzte Parameter der Methode sein, es sei denn, die Methode besitzt einen Parameter mit dem Präfix
&
(siehe unten). In Ruby 1.9 muss ein Parameter mit dem Präfix
*
immer noch hinter jeglichen Parametern mit Standardwerten stehen, aber dahinter dürfen weitere normale Parameter stehen. Er muss noch immer vor einem eventuellen Parameter mit
&
-Präfix stehen.
6.4.2.1 Arrays an Methoden übergeben
Wir haben gesehen, wie
*
in einer Methodendeklaration verwendet werden kann, um dafür zu sorgen, dass mehrere Argumente in einem einzelnen Array gesammelt oder zusammengefügt werden. Es kann auch bei einem Methodenaufruf verwendet werden, um die Elemente eines Array (oder Range- oder Enumerator-Objekts) zu zerteilen, zu erweitern oder auszupacken, so dass jedes Element zu einem einzelnen Methodenargument wird. Das
*
wird
Weitere Kostenlose Bücher