Funktionen definieren
In dieser Lektion schreibst du eigene Funktionen. Einige Funktionen, die zu Lua gehören, kennst du schon: print, math.floor, table.insert. Jede davon ist ein Stück Code, das jemand einmal geschrieben und benannt hat, damit du es mit einer einzigen Zeile so oft ausführen kannst, wie du willst.
Eigene Funktionen helfen auf dieselbe Weise. Emma erledigt jeden Morgen dieselben Aufgaben, und ein Programm, das sie für eine ganze Woche auflistet, würde dieselben Zeilen siebenmal wiederholen. Wollte sie eine Aufgabe hinzufügen, müsste sie das an sieben Stellen tun und würde bestimmt eine vergessen. Stattdessen schreibst du die Zeilen einmal und gibst ihnen einen Namen. So ein benanntes Stück Code ist eine Funktion. Dieses Programm erstellt eine Funktion mit Emmas Aufgaben und führt sie dann für zwei Tage aus:
local function morgenAufgaben()
print("Hühner füttern")
print("Bella melken")
end
print("Montag")
morgenAufgaben()
print("Dienstag")
morgenAufgaben()Das gibt Folgendes aus:
Montag
Hühner füttern
Bella melken
Dienstag
Hühner füttern
Bella melkenDie ersten vier Zeilen erstellen die Funktion. Das nennt man sie definieren, und die Definition besteht aus diesen Teilen:
local functionbeginnt die Definition.localbedeutet dasselbe wie bei Variablen: Die Funktion gehört zu diesem Programm. Später in dieser Lektion siehst du, warum das wichtig ist.- Der Name, hier
morgenAufgaben. Es gelten dieselben Regeln wie für Variablennamen, und auch er wird in camelCase geschrieben. Wähle einen Namen, der sagt, was die Funktion tut. - Die Klammern
(). Sie sind vorerst leer; in der nächsten Übung erfährst du, was hineingehört. - Der Rumpf: die Zeilen, die die Funktion ausführt, mit 4 Leerzeichen eingerückt.
end, das die Funktion abschließt, so wie esifund Schleifen abschließt.
Eine Definition allein führt nichts aus. Ohne die Zeilen darunter würde das Programm nichts ausgeben, und das wäre kein Fehler: Eine Definition sagt Lua nur, was die Funktion tun soll, wie ein Rezept in einem Notizbuch. Um die Funktion auszuführen, rufst du sie auf: Du schreibst ihren Namen und Klammern, morgenAufgaben().
Lua führt das Programm von oben nach unten aus. Es geht an der Definition vorbei und merkt sich die Funktion nur. Dann gibt es Montag aus, und beim Aufruf springt es in die Funktion, führt ihren Rumpf aus und macht mit der Zeile nach dem Aufruf weiter. Die Aufrufe sind nicht eingerückt, weil sie nicht zum Rumpf gehören. Die Leerzeile nach end ist nicht nötig, aber sie macht das Programm leichter lesbar.
Die Klammern machen einen Aufruf erst zu einem Aufruf. Der Name allein, morgenAufgaben in einer eigenen Zeile, ist ein Syntaxfehler. Und print(morgenAufgaben) führt die Funktion ebenfalls nicht aus: Es gibt etwas wie function: 0x10ead0 aus, so gibt Lua die Funktion selbst aus.
Eine Funktion existiert erst ab der Zeile, in der sie definiert wird. Sie früher aufzurufen ist ein häufiger Fehler:
morgenAufgaben()
local function morgenAufgaben()
print("Hühner füttern")
endDas Programm endet mit einem Fehler:
main.lua:1: attempt to call a nil value (global 'morgenAufgaben')In Zeile 1 kennt Lua noch kein morgenAufgaben, also hat der Name den Wert nil, und nil kann man nicht aufrufen. (Was global bedeutet, lernst du später in dieser Lektion.) Denselben Fehler bekommst du, wenn der Name im Aufruf anders geschrieben ist als in der Definition, zum Beispiel MorgenAufgaben(): Groß- und Kleinschreibung zählt. Darum definiert man Funktionen oben im Programm und ruft sie weiter unten auf.
So schreibst du es:
Anweisungen
- 1
An jedem Markttag gibt das Programm den Tag und das Schild von Emmas Stand aus, deshalb sind die drei Zeilen des Schilds zweimal geschrieben. Definiere unter dem Kommentar ganz oben eine lokale Funktion
zeigeSchild, deren Rumpf die drei Zeilen des Schilds ausgibt. Führe das Programm aus: Es gibt dasselbe aus wie vorher, weil die Funktion noch niemand aufruft. - 2
Ersetze die drei Zeilen des Schilds unter
Montagund unterDienstagdurch einen Aufruf vonzeigeSchild. Füge dann einen dritten Markttag hinzu: GibMittwochaus und rufezeigeSchildnoch einmal auf. Die Ausgabe endet mit:Mittwoch =============== Sonnenblumenhof =============== - 3
Emma möchte, dass auf dem Schild steht, was sie verkauft. Füge im Rumpf von
zeigeSchildeine Zeile hinzu, dieFrisches Gemüseausgibt, zwischenSonnenblumenhofund der unteren Linie. Führe das Programm aus: Alle drei Schilder haben sich geändert. Du hast eine Stelle im Code geändert, und alle drei Aufrufe tun etwas Neues. Dafür sind Funktionen da. Das Programm gibt Folgendes aus:Montag =============== Sonnenblumenhof Frisches Gemüse =============== Dienstag =============== Sonnenblumenhof Frisches Gemüse =============== Mittwoch =============== Sonnenblumenhof Frisches Gemüse ===============