Lua: Tabellen als Listen

Anmerkung Januar 2021: Leider lässt es repl.it nicht mehr zu, dass nicht angemeldete Benutzer:innen die Codebeispiele ändern. Das ist sehr bedauerlich, ich kann es aber nicht ändern. Ihr müsst also, wenn ihr die Codebeispiele modifizieren oder Übungsaufgaben lösen wollt, einen repl.it Account anlegen. Das ist in der Basisversion kostenlos: https://repl.it/signup

Tabellen

Tabellen sind das Schweizer Taschenmesser unter den Lua-Datentypen. Fast alles, was in Lua irgendwie zusammengesetzt ist, verpacken wir in Tabellen:

– Eine Spielerin mit Eigenschaften wie „Name“, „Punktestand“, „aktuelle Position“ etc…
– Alle in einer Physiksimulation umherfliegenden Partikel
– Alle in einer Pizzeria-Simulation vorhandenen Extra-Beläge
– Die Eigenschaften eines Bausteins in Minetest
– Der Inhalt einer Tasche für einen Freibadbesuch

Liste oder Lexikon?

Tabellen können also sehr unterschiedliche Dinge darstellen. Ein wichtiger Unterschied ist, ob eine Tabelle eher wie eine Liste oder wie ein Lexikon funktioniert. Das erste Beispiel zeigt die Verwendung als Liste.

Zeile 1 zeigt eine Möglichkeit, eine „listen-artige“ Tabelle anzulegen: Ihr schreibt die Elemente, die die Tabelle enthalten soll, einfach hintereinander weg zwischen zwei geschweifte Klammern: {'dies, 'das', 'jenes'}.

Damit ihr hinterher Zugriff auf die Tabelle habt, müsst ihr sie mit einem Namen verknüpfen:
tasche = {...}

Wie ihr an die Sachen in der Tasche herankommt, das seht ihr ab Zeile 3:
tasche[1] liefert das erste Element zurück.
tasche[2] liefert das zweite Element zurück.
und so weiter!
tasche[5] gibt es nicht, daher bekommt ihr nil zurück.

Ihr könnt der Tabelle weitere Elemente hinzufügen, indem ihr zum Beispiel in Zeile 2 schreibt:
tasche[5] = 'Mineralwasser'. Probiert das aus!

Eine Liste aufzählen

Das nächste Beispiel zeigt, wie ihr die Elemente einer Tabelle aufzählen könnt. Das funktioniert mit einer for-Schleife.

pairs(zutaten) liefert für jedes Element in der Tabelle ein Schlüssel-Wert-Paar. Was heißt das?

Der Schlüssel ist die Stelle, an der etwas in der Tabelle gespeichert ist. Das ist in unserem Fall einfach die Position, zum Beipiel 1 für 'Mehl', 2 für 'Wasser' und so weiter.

Der Wert ist das Element selber, also zum Beispiel 'Mehl'.

Der Unterschied zu einer normalen for-Schleife…

for i = 1, 10 do
  print(i)
end

…ist also, dass ihr nicht einen Zahlenbereich, sondern eine Tabelle durchlauft.

Ihr könnt die Bezeichnungen für den Schlüssel und den Wert frei wählen, wie ihr im folgenden, leicht veränderten Beispiel seht.

Das Beispiel zeigt außerdem, wie ihr herausfindet, wie viele Elemente eine Tabelle enthält, nämlich mit einem vorangestellten #. Achtung: das funktioniert nicht immer. Wir kommen später auf das Problem zurück.