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?
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.
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
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
- vous supprimez votre table et la remplacez par un int
- vous ne tirez pas une valeur de la table
Essayez:
names = {'John','Joe','Steve'}
for i = 1,3 do
print(names[i])
end