web-dev-qa-db-fra.com

Pour Loop on Lua

Mon devoir est de savoir comment faire une boucle for. Je l'ai compris en termes de chiffres 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 solutions mais cela ne fonctionne tout simplement pas, le terminal ne mentionne toujours que 1, 2, 3 ... Qu'est-ce que je fais de travers?

73
SamYoungNY

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 names n'a aucune pertinence. Toute utilisation de names dans la boucle for fera référence à celle locale, pas à la transaction 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 compteur qui compte du premier au dernier, et appelle le code interne une fois pour chaque valeur qu'il compte.

Ce que tu voulais réellement était quelque chose comme ça:

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

La syntaxe [] indique comment vous accédez aux membres d'une table Lua. Les tables Lua associent les "clés" aux "valeurs". Votre tableau crée automatiquement des clés de type entier, qui augmentent. La clé associée à "Joe" dans le tableau est donc 2 (les indices de Lua commencent toujours à 1).

Par conséquent, vous avez besoin d’une boucle for allant de 1 à 3. Vous utilisez la variable count pour accéder à l'élément depuis la table.

Cependant, cela a un défaut. Que se passe-t-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 avons John Joe nil, parce que toute tentative d'accès à des valeurs d'une table inexistante a pour résultat nil. Pour éviter cela, nous devons compter de 1 à la longueur du tableau:

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

Le # est l'opérateur de longueur. Cela fonctionne sur les tables et les chaînes, retournant la longueur de l'un ou de l'autre. Maintenant, peu importe 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 de Lua qui parcourt une liste. Ce style de boucle for, l'itérateur de boucle, utilise ce type de fonction d'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 beaucoup de travail pour vous.

179
Nicol Bolas

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

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 ne faites que faire passer i de 1 à 3.

Sur Way2 à la place, vous spécifiez la table que vous souhaitez exécuter et affectez 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
17
derp
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. Vous supprimez votre table et le remplacez par un int
  2. Vous ne tirez pas une valeur de la table

Essayer:

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