Verschachtelte Tabellen
Ein Wert in einer Tabelle kann eine andere Tabelle sein, und die kann weitere Tabellen enthalten. So beschreibst du etwas Größeres, wie den ganzen Hof:
local hof = {
name = "Sonnenblumenhof",
muenzen = 120,
scheune = {eier = 18, milch = 6},
felder = {"Karotten", "Kartoffeln", "Kürbis"},
}
print(hof.scheune.eier)
print(hof.felder[2])
print(#hof.felder)Das gibt Folgendes aus:
18
Kartoffeln
3Lies hof.scheune.eier von links nach rechts: hof.scheune ist die Tabelle der Scheune, und .eier liest daraus den Schlüssel eier. Du kannst Punkte und eckige Klammern beliebig weit aneinanderhängen: hof.felder[2] ist das zweite Element der Liste im Feld felder. Einen Wert zu ändern funktioniert genauso: hof.scheune.eier = hof.scheune.eier + 6.
Die inneren Tabellen können Dictionaries, Listen oder Datensätze sein, beliebig gemischt. Hier ist ein Dictionary von Datensätzen, einer für jedes Tier:
local tiere = {
bella = {art = "Kuh", alter = 4},
rex = {art = "Hund", alter = 2},
}
print(tiere.bella.art .. ", " .. tiere.bella.alter .. " Jahre alt")
print(tiere.rex.art)Kuh, 4 Jahre alt
HundAuch Listen können verschachtelt sein: Ein Feld aus Beeten, Reihe für Reihe, ist eine Liste von Listen, und beete[2][3] ist das dritte Beet in der zweiten Reihe.
Der typische Fehler ist, durch eine Tabelle zu lesen, die es nicht gibt. Sagen wir, Emma bewahrt ihr Werkzeug in einem Schuppen auf, aber der Hof hat noch keinen Schuppen:
local hof = {name = "Sonnenblumenhof", scheune = {eier = 18}}
print(hof.schuppen.werkzeug)main.lua:3: attempt to index a nil value (field 'schuppen')Indizieren einer Tabelle bedeutet, an einen ihrer Schlüssel zu kommen, mit einem Punkt oder eckigen Klammern. hof.schuppen ist nil, und aus nil kannst du den Schlüssel werkzeug nicht lesen. Die Meldung nennt das Feld, das nil war, 'schuppen': Das Problem liegt im Teil vor dem letzten Punkt, nicht bei werkzeug. Denselben Fehler bekommst du beim Zuweisen, hof.schuppen.werkzeug = 4: Lua erstellt die innere Tabelle nicht für dich. Erstelle sie zuerst:
local hof = {name = "Sonnenblumenhof", scheune = {eier = 18}}
hof.schuppen = {}
hof.schuppen.werkzeug = 4
print(hof.schuppen.werkzeug)4Oder in einem Schritt: hof.schuppen = {werkzeug = 4}. Wenn du nicht sicher bist, dass eine innere Tabelle da ist, prüfe zuerst: if hof.schuppen then … end, oder in einem Ausdruck hof.schuppen and hof.schuppen.werkzeug, was nil statt eines Fehlers ergibt, wenn es keinen Schuppen gibt.
So schreibst du es:
Anweisungen
- 1
Das Programm endet mit einem Fehler: Der Hof selbst hat keine Milch; die Milch ist in der Scheune. Behebe das
print, sodass es Folgendes ausgibt:Milch: 6 Liter - 2
Ein neues Huhn namens Goldie ist auf den Hof gekommen. Füge es unter dem
printmittable.insertzur Listehof.tierehinzu, als Datensatz mit dem Namen"Goldie"und der Art"Huhn". Gehe dann die Liste mitipairsdurch und gib jedes Tier aus:Bella: Kuh Rex: Hund Goldie: Huhn - 3
Emma hat einen Schuppen für ihre 4 Werkzeuge gebaut. Füge am Ende des Programms den Schlüssel
schuppenzuhofhinzu, mit einer Tabelle, die den Schlüsselwerkzeugeund den Wert4enthält. Gib dann aus und lies die Zahl dabei mithof.schuppen.werkzeuge:Werkzeuge: 4