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.
_
wenn die Variable nicht verwendet wird. zBnames = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Wenn Sie online lesen ( Tabellen-Tutorial ), scheinen sich Tabellen wie Arrays zu verhalten, also suchen Sie nach:
Weg1
Weg2
Way1 verwendet die Tabelle
index/key
. In Ihrer Tabelle hatnames
jedes Element einen Schlüssel ab 1, zum Beispiel:Sie müssen also nur
i
von 1 auf 3 gehen.Auf Way2 geben Sie stattdessen an, welche Tabelle Sie ausführen möchten, und weisen eine Variable für ihren Schlüssel und Wert zu, zum Beispiel:
druckt Folgendes:
quelle
ipairs
? Oder der Teil, inpairs
dem die Schlüsselwerte nicht in einer bestimmten Reihenfolge zurückgegeben werden müssen?ipairs
zuerst verwendet, aber als ich dasmyKey="myValue"
Beispiel hinzugefügt habe, daspairs
für den nicht numerischen Schlüssel benötigt wird, habe ich beschlossen, auch den Rest für zu ändernpairs
. Es tut mir leid, wenn ich weggelassen habe, dass die Bestellung nicht paarweise garantiert ist, aber ich habe den Link genau dort gelassen, damit er ihn lesen kann.Versuchen:
quelle
names
(der Ganzzahlzähler), wie imfor
Bereich deklariert , eine lokale Variable einführt, die dasnames
(das Tabellenarray) wie im globalen Bereich deklariert schattiert .