Schleifen mit ipairs
Eine Liste vom ersten bis zum letzten Element durchzugehen ist so häufig, dass Lua dafür eine Abkürzung hat. Neben dem numerischen for, das du kennst, gibt es eine zweite Art von for-Schleife, die ihre Werte von einer Funktion bekommt. Mit der Funktion ipairs geht sie die Elemente einer Liste durch:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
for i, pflanze in ipairs(pflanzen) do
print(i, pflanze)
endDas gibt Folgendes aus:
1 Karotte
2 Kartoffel
3 KürbisLies die erste Zeile so: Für jeden Index i und jedes Element pflanze in der Liste pflanzen mache Folgendes. In jedem Durchlauf gibt dir die Schleife zwei Werte: den Index und das Element an diesem Index. Du musst nicht pflanzen[i] schreiben: Das Element steht schon in pflanze. Der Name ipairs kommt von index–value pairs, also Paaren aus Index und Wert.
Wie beim numerischen for gibt es beide Variablen nur innerhalb der Schleife, und du kannst sie nennen, wie du willst. Ein guter Name für das Element ist der Singular des Listennamens: pflanze in pflanzen, preis in preise.
Oft brauchst du den Index nicht. Dann schreibe an seiner Stelle _ (einen Unterstrich):
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
for _, pflanze in ipairs(pflanzen) do
print("Gießen: " .. pflanze)
endDas gibt Folgendes aus:
Gießen: Karotte
Gießen: Kartoffel
Gießen: Kürbis_ ist ein gewöhnlicher Variablenname, aber Lua-Programmierer benutzen ihn für Werte, die sie nicht brauchen, damit jeder, der den Code liest, weiß, dass der Index nicht benutzt wird. Du kannst den Index aber nicht einfach weglassen. Die erste Variable bekommt immer den Index, wie sie auch heißt:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
for pflanze in ipairs(pflanzen) do
print(pflanze)
endDas gibt Folgendes aus:
1
2
3Trotz ihres Namens hat pflanze die Indizes bekommen. Ein weiterer häufiger Fehler ist, ipairs zu vergessen. Die Schleife erwartet nach in eine Funktion und bekommt die Tabelle:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
for i, pflanze in pflanzen do
print(pflanze)
endmain.lua:2: attempt to call a table value (for iterator 'for iterator')Zwei weitere Dinge zu ipairs:
- Es hält beim ersten
nilan. In einer Liste mit einem Loch geht es nur bis zum Loch und überspringt die Elemente danach. Das ist ein weiterer Grund, keine Löcher zu lassen. - Wenn du
pflanzeeinen neuen Wert zuweist, ändert das nur die Variable, nicht die Liste. Um ein Element zu ändern, schreibepflanzen[i] = …, wie in der vorigen Übung.
Welche Schleife solltest du also nehmen? ipairs, wenn du eine Liste von Anfang bis Ende durchgehst, also meistens. Das numerische for, wenn du etwas anderes brauchst, zum Beispiel rückwärts zu gehen. In der Lektion über Dictionaries lernst du die Schwester von ipairs kennen, die Funktion pairs.
So schreibst du es:
Anweisungen
- 1
Schreibe eine Schleife mit
ipairs, dieeierdurchgeht, mit der Variablentagfür den Index undanzahlfür das Element. - 2
Gib in der Schleife die Eier jedes Tages aus:
Tag 1: 4 Eier Tag 2: 6 Eier Tag 3: 5 Eier Tag 4: 7 Eier Tag 5: 3 Eier Tag 6: 6 Eier Tag 7: 5 Eier - 3
Schreibe darunter eine zweite
ipairs-Schleife übereier, mit_anstelle des Index. Zähle darin die guten Tage, an denen die Hühner mindestens 6 Eier gelegt haben. (Erzeuge den Zähler vor der Schleife, wie in der Lektion über Schleifen.) - 4
Gib nach der Schleife das Ergebnis aus:
Gute Tage: 3.