Die Länge einer Liste
Den Operator # kennst du von Texten: #"Karotte" ist 7, die Länge des Textes. Setze ihn vor eine Liste, und er gibt dir die Anzahl der Elemente, die Länge der Liste:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
print(#pflanzen)
print("Pflanzen: " .. #pflanzen)
print(#{})Das gibt Folgendes aus:
3
Pflanzen: 3
0Eine leere Liste hat die Länge 0. # gibt eine gewöhnliche Zahl, du kannst also damit rechnen: #pflanzen + 1 ist 4. Verwechsle aber #pflanzen nicht mit #pflanzen[1]. Das zweite ist die Länge des ersten Elements, des Textes "Karotte": 7.
Die Länge sagt dir auch, wo das letzte Element ist. Die Indizes gehen von 1 bis zur Anzahl der Elemente, der letzte Index ist also die Länge selbst: Eine Liste mit 3 Elementen hat die Indizes 1, 2 und 3. Das letzte Element ist pflanzen[#pflanzen]:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
print(pflanzen[#pflanzen])
print(pflanzen[#pflanzen - 1])Das gibt Folgendes aus:
Kürbis
KartoffelLua berechnet zuerst den Index in den eckigen Klammern (#pflanzen ist 3, und 3 − 1 ist 2) und liest dann das Element an diesem Index. pflanzen[#pflanzen - 1] ist also das vorletzte Element.
Warum schreibst du nicht einfach pflanzen[3]? Weil sich Listen ändern. In den nächsten Übungen fügst du Elemente hinzu und entfernst sie, und Programme arbeiten oft mit Listen, die sie nicht selbst erstellt haben und die beliebig lang sind. pflanzen[#pflanzen] ist immer das letzte Element, egal wie lang die Liste ist. Mit pflanzen[3] würde das Programm immer die dritte Pflanze ausgeben, auch nachdem Emma eine vierte gepflanzt hat.
Ein häufiger Fehler ist, einen Schritt zu weit zu gehen. pflanzen[#pflanzen + 1] ist der Platz direkt hinter dem letzten Element, an dem noch nichts steht:
local pflanzen = {"Karotte", "Kartoffel", "Kürbis"}
print("Letzte Pflanze: " .. pflanzen[#pflanzen + 1])main.lua:2: attempt to concatenate a nil value (field '?')Diesmal steht in der Meldung field '?'. Lua beschreibt den Index nur, wenn er eine im Code geschriebene Zahl ist; hier musste es ihn erst berechnen. Der Platz #pflanzen + 1 wird aber nützlich: In der nächsten Übung fügst du genau dort ein neues Element hinzu.
So schreibst du es:
Anweisungen
- 1
Gib unter dem
printmit#die Anzahl der Samenbeutel in der Liste aus:Beutel: 5. - 2
Erzeuge eine lokale Variable
letztermit dem letzten Element vonsamen. Hole es mit#und nicht mit der Zahl5. - 3
Gib es aus:
Letzter: Weizen. - 4
Gib zum Schluss den vorletzten Beutel auf dieselbe Weise aus, mit
#samen - 1:Vorletzter: Erdbeere.