Parameter und Argumente
Die Funktion morgenAufgaben tut jedes Mal genau dasselbe. Oft soll eine Funktion aber fast dasselbe tun, nur mit einem anderen Wert: erst die Karotten gießen, dann die Kartoffeln. Solche Werte bekommt eine Funktion über Parameter:
local function giesse(pflanze)
print("Gießen: " .. pflanze)
end
giesse("Karotten")
giesse("Kartoffeln")Das gibt Folgendes aus:
Gießen: Karotten
Gießen: KartoffelnIn der Definition ist pflanze in den Klammern ein Parameter: eine lokale Variable der Funktion, die sie in ihrem Rumpf benutzen kann. Im Aufruf ist der Wert in den Klammern, "Karotten", ein Argument. Wenn du die Funktion aufrufst, speichert Lua das Argument im Parameter und führt dann den Rumpf aus. Beim ersten Aufruf ist pflanze gleich "Karotten", beim zweiten "Kartoffeln".
Die beiden Wörter verwechselt man leicht, merke dir also: Ein Parameter ist ein Name in der Definition, ein Argument ist ein Wert im Aufruf. Ein Argument kann auch eine Variable oder eine Rechnung sein, zum Beispiel giesse(pflanzen[1]). Du übergibst schon seit der ersten Lektion Argumente: "Hallo" in print("Hallo") ist eines.
Eine Funktion kann mehrere Parameter haben, getrennt durch Kommas. Die Argumente werden der Reihe nach in sie eingesetzt: das erste Argument in den ersten Parameter, das zweite in den zweiten und so weiter:
local function saeen(pflanze, anzahl)
print("Säe " .. anzahl .. " " .. pflanze)
end
saeen("Karotten", 12)
saeen(12, "Karotten")Das gibt Folgendes aus:
Säe 12 Karotten
Säe Karotten 12Beim zweiten Aufruf sind die Argumente vertauscht, also kam 12 in pflanze und "Karotten" in anzahl. Lua weiß nicht, was die Werte bedeuten, nur in welcher Reihenfolge sie stehen.
Viele Sprachen prüfen, dass jeder Aufruf genau so viele Argumente übergibt, wie die Funktion Parameter hat. Lua tut das nicht. Ein fehlendes Argument ist einfach nil, und überzählige werden weggeworfen:
local function saeen(pflanze, anzahl)
print(pflanze, anzahl)
end
saeen("Weizen")
saeen("Mais", 5, "extra")Das gibt Folgendes aus:
Weizen nil
Mais 5Das kann praktisch sein, wie du in der Übung zu Standardwerten sehen wirst. Aber ein vergessenes Argument ist kein Fehler im Aufruf. Der Fehler zeigt sich erst später, in der Funktion, wo sie das nil benutzt:
local function saeen(pflanze, anzahl)
print("Säe " .. anzahl .. " " .. pflanze)
end
saeen("Weizen")Das Programm endet mit einem Fehler:
main.lua:2: attempt to concatenate a nil value (local 'anzahl')
stack traceback:
main.lua:2: in local 'saeen'
main.lua:5: in main chunkDer Fehler steht in Zeile 2, in der Funktion, aber der Fehler liegt im Aufruf in Zeile 5. Die Zeilen unter stack traceback: zeigen, wie das Programm dorthin gekommen ist. Lies sie von unten: Das Hauptprogramm (main chunk) hat saeen in Zeile 5 aufgerufen, und Zeile 2 von saeen ist fehlgeschlagen. Wenn eine Fehlermeldung einen Parameter nennt, wie local 'anzahl', prüfe die Aufrufe der Funktion: Übergibt jeder alle Argumente, in der richtigen Reihenfolge?
So schreibst du es:
Anweisungen
- 1
Emma pflanzt ihre Pflanzen in Reihen, und du zeichnest sie mit Buchstaben. Schreibe eine lokale Funktion
zeichneReihemit zwei Parametern,zeichenundanzahl. Sie gibt den Textzeichenanzahl-mal in einer Zeile aus: Gib ihn in einerfor-Schleife mitio.writeaus, und beende die Zeile nach der Schleife mitprint(). - 2
Rufe unter der Funktion
zeichneReihe("K", 5)für eine Reihe aus fünf Karotten undzeichneReihe("T", 3)für eine Reihe aus drei Tomaten auf. Das Programm gibt Folgendes aus:KKKKK TTT - 3
Ein Argument kann auch eine Variable sein. Emmas Erdbeerbeet ist ein Dreieck: Jede Reihe hat eine Pflanze mehr als die Reihe davor. Schreibe unter den beiden Aufrufen eine
for-Schleife, in derivon1bis4läuft und diezeichneReihe("E", i)aufruft. In jedem Durchlauf der Schleife bekommt die Funktion ein anderes Argument, also zeichnet das Programm:E EE EEE EEEE