Die Programmiersprache Ruby (German Edition)
Methode, die die Summe ihrer Argumente zurückgibt:
def sum x, y
x+y
end
6.3.2 Notwendige Klammern
Mancher Code ist mehrdeutig, wenn die Klammern weggelassen werden, und hier verlangt Ruby, dass Sie sie einfügen. Der häufigste Fall sind verschachtelte Methodenaufrufe in der Form
f g x, y
. In Ruby stehen Aufrufe dieser Form für
f(g(x,y))
. Ruby 1.8 gibt jedoch eine Warnung aus, weil der Code auch als
f(g(x),y)
interpretiert werden könnte. In Ruby 1.9 wurde die Warnung entfernt. Der folgende Code, der die oben definierte Methode
sum
verwendet, gibt
4
aus, löst in Ruby 1.8 aber eine Warnung aus:
puts sum 2, 2
Um die Warnung loszuwerden, schreiben Sie den Code mit Klammern um die Argumente neu:
puts sum(2,2)
Beachten Sie, dass die Verwendung von Klammern um den äußeren Methodenaufruf die Mehrdeutigkeit nicht auflöst:
puts(sum 2,2) # Heißt das puts(sum(2,2)) oder puts(sum(2), 2)?
Ein Ausdruck, der verschachtelte Funktionsaufrufe enthält, ist nur dann zweideutig, wenn es mehr als ein Argument gibt. Der Ruby-Interpreter kann den folgenden Code nur auf eine Art und Weise ausführen:
puts factorial x # Dies kann nur puts(factorial(x)) heißen
Trotz der fehlenden Mehrdeutigkeit gibt Ruby 1.8 hier immer noch eine Warnung aus, wenn Sie die Klammern um das
x
weglassen.
Manchmal ist das Weglassen von Klammern ein echter Syntaxfehler und nicht nur einfach ein Anlass zur Ausgabe einer einfachen Warnung. Die folgenden Ausdrücke sind ohne Klammern beispielsweise absolut mehrdeutig, und Ruby versucht noch nicht einmal zu raten, was Sie meinen:
puts 4, sum 2,2 # Fehler: Gehört das zweite Komma zur ersten oder zur zweiten Methode?
[sum 2,2] # Fehler: Zwei Array-Elemente oder eins?
Aus der Tatsache, dass Klammern optional sind, ergibt sich eine weitere Falle: Wenn Sie in einem Methodenaufruf Klammern verwenden, dann muss die öffnende Klammer unmittelbar auf den Methodennamen folgen, ohne trennendes Leerzeichen. Das liegt daran, dass Klammern zwei Aufgaben erledigen: Sie können um eine Argumentliste herum in einem Methodenaufruf oder zum Gruppieren von Ausdrücken verwendet werden. Betrachten Sie die beiden folgenden Ausdrücke, die sich nur durch ein einzelnes Leerzeichen voneinander unterscheiden:
square(2+2)*2 # square(4)*2 = 16*2 = 32
square (2+2)*2 # square(4*2) = square(8) = 64
Im ersten Ausdruck repräsentieren die Klammern den Methodenaufruf. Im zweiten repräsentieren sie dagegen eine Ausdrucksgruppierung. Um die potenzielle Verwirrung zu vermindern, sollten Sie stets Klammern um einen Methodenaufruf verwenden, sobald Argumente oder Teile von ihnen Klammern verwenden. Der zweite Ausdruck sollte deutlicher so geschrieben werden:
square((2+2)*2)
Wir beenden diese Diskussion über Klammern mit einer letzten Ungereimtheit. Erinnern Sie sich, dass der folgende Ausdruck mehrdeutig ist und eine Warnung erzeugt?
puts(sum 2,2) # Heißt das puts(sum(2,2)) oder puts(sum(2), 2)?
Die beste Möglichkeit, diese Mehrdeutigkeit aufzulösen, besteht darin, Klammern um die Argumente der Methode
sum
zu setzen. Eine weitere Möglichkeit besteht darin, ein Leerzeichen zwischen
puts
und der öffnenden Klammer einzufügen:
puts (sum 2,2)
Das Einfügen des Leerzeichens wandelt die Methodenaufrufklammern in Klammern zur Ausdrucksgruppierung um. Da diese Klammern einen Teilausdruck gruppieren, kann das Komma nicht mehr als Argumenttrennzeichen für den
puts
-Aufruf interpretiert werden.
6.4 Methodenargumente
Einfache Methodendeklarationen enthalten eine durch Komma getrennte Liste von Argumentnamen (in optionalen Klammern) hinter dem Methodennamen. Aber es gibt mehr über Rubys Methodenargumente zu wissen. Die nachfolgenden Unterabschnitte erläutern,
wie man ein Argument deklariert, das einen Standardwert hat, so dass das Argument beim Aufruf der Methode weggelassen werden kann,
wie man eine Methode deklariert, die eine beliebige Anzahl von Argumenten akzeptiert,
wie man mit einer speziellen Syntax zur Übergabe eines Hash an eine Methode benannte Methodenargumente simuliert und
wie man eine Methode so deklariert, dass der mit einem Aufruf der Methode verknüpfte Block als Methodenargument behandelt wird.
6.4.1 Parameterstandardwerte
Wenn Sie eine Methode definieren, können Sie Standardwerte für einige oder alle Parameter angeben. Wenn Sie das tun, kann Ihre Methode mit weniger Argumenten aufgerufen werden als die Deklaration Parameter enthält. Wenn Argumente weggelassen werden, wird stattdessen der Standardwert des
Weitere Kostenlose Bücher