Einfügen und Entfernen
Lua bringt eine Gruppe von Funktionen für die Arbeit mit Listen mit. Ihre Namen beginnen mit table., so wie die Namen der Mathe-Funktionen mit math. beginnen. Die zwei, die du am häufigsten benutzt, sind table.insert und table.remove.
table.insert(liste, wert) hängt den Wert ans Ende der Liste. Es macht dasselbe wie liste[#liste + 1] = wert, ist aber leichter zu lesen. Mit drei Werten in den Klammern setzt table.insert(liste, position, wert) den Wert an die angegebene Position. Die Elemente ab dieser Position rücken einen Platz nach rechts, ihre Indizes steigen also um eins:
local aufgaben = {"Hühner füttern", "Feld gießen"}
table.insert(aufgaben, "Bella melken")
table.insert(aufgaben, 1, "Rex rauslassen")
print(#aufgaben)
print(aufgaben[1])
print(aufgaben[2])
print(aufgaben[4])Das gibt Folgendes aus:
4
Rex rauslassen
Hühner füttern
Bella melkenDie Position steht vor dem Wert. Wenn du sie vertauschst, wie in table.insert(aufgaben, "Bella melken", 1), hält das Programm mit bad argument #2 to 'insert' (number expected, got string) an: Der zweite Wert in den Klammern (das zweite Argument) hätte eine Zahl sein müssen. Die Position muss außerdem zwischen 1 und #aufgaben + 1 liegen. Alles andere, wie table.insert(aufgaben, 10, "Pause"), endet mit bad argument #2 to 'insert' (position out of bounds). So hinterlässt table.insert nie ein Loch.
table.remove(liste) entfernt das letzte Element, und table.remove(liste, position) entfernt das Element an dieser Position. Die Elemente dahinter rücken einen Platz nach links, es entsteht also kein Loch. Beide geben dir auch das entfernte Element zurück. Wir sagen, sie liefern es zurück, so wie math.floor eine gerundete Zahl zurückgibt. Du kannst es in einer Variablen speichern:
local aufgaben = {"Rex rauslassen", "Hühner füttern", "Bella melken", "Feld gießen"}
local erledigt = table.remove(aufgaben, 1)
print("Erledigt: " .. erledigt)
print("Als Nächstes: " .. aufgaben[1])
local spaeter = table.remove(aufgaben)
print("Morgen: " .. spaeter)
print("Übrig: " .. #aufgaben)Das gibt Folgendes aus:
Erledigt: Rex rauslassen
Als Nächstes: Hühner füttern
Morgen: Feld gießen
Übrig: 2Nach dem ersten table.remove ist "Hühner füttern" von Index 2 auf Index 1 gerückt. Wenn du das entfernte Element nicht brauchst, schreibe einfach table.remove(aufgaben, 1) in eine eigene Zeile. Aus einer leeren Liste zu entfernen ist kein Fehler: Nichts wird entfernt, und du bekommst nil zurück.
Vergleiche es mit aufgaben[1] = nil. Das leert nur den ersten Platz und hinterlässt ein Loch am Anfang der Liste: aufgaben[1] ist dann nil, und "Als Nächstes: " .. aufgaben[1] endet mit attempt to concatenate a nil value. Um ein Element zu entfernen, nimm table.remove.
So schreibst du es:
Anweisungen
- 1
Rex kratzt an der Tür. Füge unter dem
printmittable.insert"Rex rauslassen"am Anfang der Liste ein, an der Position 1. - 2
Opa Josef hat Emma gebeten, ihm bei seinem Zaun zu helfen. Hänge
"Opa Josef helfen"mittable.insertans Ende der Liste. - 3
Emma hat Rex rausgelassen. Entferne die erste Aufgabe mit
table.removeaus der Liste, speichere sie in einer lokalen Variablenerledigtund gib sie aus:Erledigt: Rex rauslassen. - 4
Gib zum Schluss die Anzahl der Aufgaben, die erste Aufgabe und die letzte aus:
Aufgaben: 4 Erste: Hühner füttern Letzte: Opa Josef helfen