Ihr Problem ist einfach:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Dieser Code deklariert zuerst eine globale Variable namens names
. Dann starten Sie eine for-Schleife. Die for-Schleife deklariert eine lokale Variable, die zufällig auch aufgerufen names
wird. Die Tatsache, dass zuvor eine Variable mit definiert wurde, names
ist völlig irrelevant. Jede Verwendung names
innerhalb der for-Schleife bezieht sich auf die lokale und nicht auf die globale Schleife .
Die for-Schleife besagt, dass der innere Teil der Schleife names = 1
dann names = 2
und schließlich aufgerufen wird names = 3
. Die for-Schleife deklariert einen Zähler , der von der ersten bis zur letzten Zahl zählt, und ruft den inneren Code für jeden gezählten Wert einmal auf.
Was Sie eigentlich wollten, war ungefähr so:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Mit der Syntax [] greifen Sie auf die Mitglieder einer Lua-Tabelle zu. Lua-Tabellen ordnen "Schlüssel" "Werten" zu. Ihr Array erstellt automatisch Schlüssel vom Typ Integer, die sich erhöhen. Der mit "Joe" in der Tabelle verknüpfte Schlüssel ist also 2 (Lua-Indizes beginnen immer bei 1).
Daher benötigen Sie eine for-Schleife, die von 1 bis 3 zählt und die Sie erhalten. Mit der Variablen count können Sie aus der Tabelle auf das Element zugreifen.
Dies hat jedoch einen Fehler. Was passiert, wenn Sie eines der Elemente aus der Liste entfernen?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Jetzt bekommen wir John Joe nil
, weil der Versuch, auf Werte aus einer Tabelle zuzugreifen, die nicht existieren, dazu führt nil
. Um dies zu verhindern, müssen wir von 1 bis zur Länge der Tabelle zählen:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
Das #
ist der Längenoperator. Es funktioniert für Tabellen und Zeichenfolgen und gibt die Länge von beiden zurück. Egal wie groß oder klein es names
wird, dies wird immer funktionieren.
Es gibt jedoch eine bequemere Möglichkeit, eine Reihe von Elementen zu durchlaufen:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
ist eine Lua-Standardfunktion, die eine Liste durchläuft. Dieser for
Schleifenstil, der Iterator für die Schleife, verwendet diese Art von Iteratorfunktion. Der i
Wert ist der Index des Eintrags im Array. Der name
Wert ist der Wert an diesem Index. Es macht also im Grunde eine Menge Grunzarbeit für dich.