Pour boucle sur Lua

Ma mission est de savoir comment faire une boucle for. Je l'ai compris en termes de nombres mais je ne peux pas le comprendre en termes de noms. Je voudrais créer une boucle for qui parcourt une liste de noms. Voici ce que j'ai jusqu'à présent:

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

J'ai essayé d'autres choses mais cela ne fonctionne tout simplement pas, le terminal liste toujours 1, 2, 3... Ce que je fais de mal?

64
demandé sur Yu Hao 2011-10-01 01:24:10

3 réponses

Votre problème est simple:

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

Ce code déclare d'abord une variable globale appelée names. Ensuite, vous commencez une boucle for. La boucle for déclare une variable locale qui s'appelle aussi names; le fait qu'une variable ait déjà été définie avec {[5] } n'est absolument pas pertinent. Toute utilisation de names dans la boucle for fera référence à local , pas à la boucle globale.

La boucle for indique que la partie interne de la boucle sera appelée avec names = 1, puis names = 2, et enfin names = 3. La boucle for déclare un counter {[24] } qui compte du premier nombre au dernier, et il appellera le code interne une fois pour chaque valeur qu'il compte.

Ce que vous vouliez réellement était quelque chose comme ceci:

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

La syntaxe [] est la façon dont vous accédez aux membres D'une table Lua. Les tables Lua mappent "clés" à "valeurs". Votre tableau crée automatiquement des clés de type entier, qui augmentent. Donc, la clé associée à " Joe " dans la table est 2 (Lua les indices commencent toujours à 1).

Par conséquent, vous avez besoin d'une boucle for qui compte de 1 à 3, que vous obtenez. Vous utilisez la variable nombre d'accéder à l'élément de la table.

Cependant, cela a un défaut. Qu'advient-il si vous supprimez l'un des éléments de la liste?

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

Maintenant, nous obtenons John Joe nil, car tenter d'accéder à des valeurs à partir d'une table qui n'existe pas aboutit à nil. Pour éviter cela, nous devons compter de 1 à la Longueur de la tableau:

names = {'John', 'Joe'}
for nameCount = 1, #names do
  print (names[nameCount])
end

Le # est l'opérateur de longueur. Il fonctionne sur les tables et les chaînes, renvoyant la longueur de l'un ou l'autre. Maintenant, peu importe la taille ou la taille de names, cela fonctionnera toujours.

Cependant, il existe un moyen plus pratique de parcourir un tableau d'éléments:

names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
  print (name)
end

ipairs est une fonction standard Lua qui itère sur une liste. Ce style de for loop, l'itérateur pour loop, utilise ce type de fonction itérateur. La valeur i est l'index de l'entrée dans le tableau. La valeur name est la valeur de cet index. Donc, il fait essentiellement beaucoup de travail de grognement pour vous.

157
répondu Nicol Bolas 2011-10-01 00:39:50

En lisant en ligne ( tutoriel sur les tables ), il semble que les tables se comportent comme des tableaux, donc vous cherchez:

Way1

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

Way2

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

Way1 utilise le tableau index/key , sur votre table names chaque élément a une clé à partir de 1, par exemple:

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

Donc vous faites juste i passer de 1 à 3.

Sur Way2 à la place, vous spécifiez la table que vous souhaitez exécuter et assignez une variable pour sa clé et sa valeur par exemple:

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

Imprime ce qui suit:

1   John
2   Joe
myKey   myValue
13
répondu derp 2011-09-30 22:03:32
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. vous supprimez votre table et la remplacez par un int
  2. vous ne tirez pas une valeur de la table

Essayez:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end
-1
répondu Elliot 2016-01-22 00:54:26