Funktionen in Tabellen
In der Lektion über Tabellen als Dictionaries hast du eine Sache mit einer Tabelle beschrieben, mit einem Datensatz wie {name = "Karotte", tage = 3}. In der Lektion über Funktionen hast du gelernt, dass eine Funktion ein Wert ist, wie eine Zahl oder ein Text: Du kannst sie in einer Variablen speichern und an eine andere Funktion übergeben. Setzt du beides zusammen, kann eine Tabelle auch Funktionen enthalten, direkt neben ihren Daten:
local hof = {name = "Sonnenblumenhof", muenzen = 120}
hof.beschreiben = function(h)
print(h.name .. ": " .. h.muenzen .. " Münzen")
end
hof.beschreiben(hof)Das gibt Folgendes aus:
Sonnenblumenhof: 120 Münzenhof.beschreiben = function(h) … end speichert eine Funktion unter dem Schlüssel beschreiben, genau wie hof.muenzen = 120 eine Zahl unter dem Schlüssel muenzen speichert. In hof.beschreiben(hof) holt hof.beschreiben die Funktion aus der Tabelle, und die Klammern rufen sie auf. Die Funktion bekommt den Hof als Parameter h und liest seine Werte.
Lua hat eine kürzere Schreibweise für dasselbe, und du wirst sie viel öfter sehen: function hof.beschreiben(h) bedeutet genau hof.beschreiben = function(h). Davor steht kein local, denn die Funktion wird keine neue Variable; sie kommt in die Tabelle hof, die schon existiert. Das nächste Beispiel benutzt die Kurzform und zeigt außerdem, dass eine Funktion in einer Tabelle die Tabelle verändern kann, die sie bekommt:
local hof = {name = "Sonnenblumenhof", muenzen = 120}
function hof.beschreiben(h)
print(h.name .. ": " .. h.muenzen .. " Münzen")
end
function hof.verdienen(h, betrag)
h.muenzen = h.muenzen + betrag
end
hof.verdienen(hof, 30)
hof.beschreiben(hof)Das gibt Folgendes aus:
Sonnenblumenhof: 150 MünzenWarum bekommt die Funktion den Hof als Parameter, wo sie doch einfach hof benutzen könnte? Weil sie dann für jede Tabelle mit denselben Schlüsseln funktioniert: hof.beschreiben({name = "Opa Josefs Hof", muenzen = 80}) gibt Opa Josefs Hof: 80 Münzen aus. Das wird bald wichtig, wenn es viele Tabellen derselben Art gibt.
Tabellen mit Funktionen benutzt du seit dem Anfang des Kurses. string und math sind gewöhnliche Tabellen, und string.upper ist die Funktion, die in der Tabelle string unter dem Schlüssel upper gespeichert ist:
print(type(string), type(string.upper), type(math.floor))Das gibt Folgendes aus:
table function functionEine Tabelle, die Daten zusammen mit den Funktionen enthält, die mit diesen Daten arbeiten, heißt Objekt. In dieser ganzen Lektion geht es um Objekte: wie du sie schreibst, wie du viele gleichartige herstellst und wie du sie mit print, ==, < und + zusammenarbeiten lässt.
Typischer Fehler: das Argument zu vergessen. In hof.beschreiben() bekommt der Parameter h keinen Wert, ist also nil:
local hof = {name = "Sonnenblumenhof", muenzen = 120}
function hof.beschreiben(h)
print(h.name .. ": " .. h.muenzen .. " Münzen")
end
hof.beschreiben()Das Programm endet mit einem Fehler:
main.lua:4: attempt to index a nil value (local 'h')Indexieren (englisch indexing) heißt, einen Schlüssel mit . oder [ ] zu lesen. h.name versucht, den Schlüssel name aus h zu lesen, und aus nil kann man nichts lesen.
So schreibst du es:
Anweisungen
- 1
In Emmas Scheune liegen Eier und Milch. Füge eine Funktion
scheune.ausgeben(s)hinzu, die ausgibt, was in der Scheunesist, und rufe sie mitscheune.ausgeben(scheune)auf. Das Programm gibt aus:Scheune: 12 Eier, 4 Liter Milch - 2
Füge eine Funktion
scheune.eierHinzufuegen(s, anzahl)hinzu, die der ScheunesanzahlEier hinzufügt. - 3
Die Hühner haben 6 weitere Eier gelegt. Füge sie am Ende des Programms mit
scheune.eierHinzufuegen(scheune, 6)hinzu und gib den Bericht noch einmal aus:Scheune: 12 Eier, 4 Liter Milch Scheune: 18 Eier, 4 Liter Milch