Für Loop auf Lua

85

Meine Aufgabe ist es, eine for-Schleife zu erstellen. Ich habe es in Zahlen herausgefunden, kann es aber nicht in Namen herausfinden. Ich möchte eine for-Schleife erstellen, die eine Liste von Namen enthält. Folgendes habe ich bisher:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

Ich habe einige andere Dinge ausprobiert, aber es funktioniert einfach nicht. Das Terminal listet immer nur 1, 2, 3 auf ... Was mache ich falsch?

SamYoungNY
quelle

Antworten:

202

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 nameswird. Die Tatsache, dass zuvor eine Variable mit definiert wurde, namesist völlig irrelevant. Jede Verwendung namesinnerhalb 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 = 1dann names = 2und 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 nameswird, 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

ipairsist eine Lua-Standardfunktion, die eine Liste durchläuft. Dieser forSchleifenstil, der Iterator für die Schleife, verwendet diese Art von Iteratorfunktion. Der iWert ist der Index des Eintrags im Array. Der nameWert ist der Wert an diesem Index. Es macht also im Grunde eine Menge Grunzarbeit für dich.

Nicol Bolas
quelle
1
Also, denn mit ipairs () funktioniert wie foreach () in anderen Sprachen
boctulus
15
Tolle Antwort, ich möchte nur hinzufügen, dass es im letzten Beispiel ziemlich üblich ist, es zu verwenden, _wenn die Variable nicht verwendet wird. zBnames = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Fraser
19

Wenn Sie online lesen ( Tabellen-Tutorial ), scheinen sich Tabellen wie Arrays zu verhalten, also suchen Sie nach:

Weg1

names = {'John', 'Joe', 'Steve'}
for i = 1,3 do print( names[i] ) end

Weg2

names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end

Way1 verwendet die Tabelle index/key. In Ihrer Tabelle hat namesjedes Element einen Schlüssel ab 1, zum Beispiel:

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John

Sie müssen also nur ivon 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:

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end

druckt Folgendes:

1   John
2   Joe
myKey   myValue
derp
quelle
6
Sie haben das Tutorial für Tabellen gelesen, aber nicht gesehen ipairs? Oder der Teil, in pairsdem die Schlüsselwerte nicht in einer bestimmten Reihenfolge zurückgegeben werden müssen?
Nicol Bolas
Eigentlich habe ich ipairszuerst verwendet, aber als ich das myKey="myValue"Beispiel hinzugefügt habe, das pairsfür den nicht numerischen Schlüssel benötigt wird, habe ich beschlossen, auch den Rest für zu ändern pairs. 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.
derp
1
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. Sie löschen Ihre Tabelle und ersetzen sie durch ein int
  2. Sie ziehen keinen Wert aus der Tabelle

Versuchen:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end
Elliot
quelle
1
Downvoter: Bitte geben Sie einen gültigen Grund für das Downvoting an. Auch wenn ich denke, dass die Antwort irreführend ist, da names(der Ganzzahlzähler), wie im forBereich deklariert , eine lokale Variable einführt, die das names(das Tabellenarray) wie im globalen Bereich deklariert schattiert .
Dejavu