Pour la 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 exécute 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 ça ne marche pas, le terminal ne fait que lister 1, 2, 3 … Qu’est-ce que je fais mal?

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 lancez une boucle for. La boucle for déclare une variable locale qui s’appelle simplement des names ; le fait qu’une variable ait déjà été définie avec des names n’a aucune importance. Toute utilisation de names dans la boucle for fera référence au local , pas au global.

La boucle for dit que la partie interne de la boucle sera appelée avec des names = 1 , puis des names = 2 et enfin des names = 3 . La boucle for déclare un compteur qui compte du premier nombre au dernier, et il appellera le code interne une fois pour chaque valeur qui compte.

Ce que vous vouliez en réalité, c’était quelque chose comme ça:

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

La syntaxe [] indique comment accéder aux membres d’une table Lua. Les tables de Lua mappent les “clés” aux “valeurs”. Votre tableau crée automatiquement des clés de type entier, qui augmentent. La clé associée à “Joe” dans la table est donc 2 (les indices Lua 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 count pour accéder à l’élément de 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 tenter d’accéder aux valeurs d’une table qui n’existe pas donne un résultat nil . Pour éviter cela, il faut compter de 1 à la longueur de la table:

 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, en renvoyant la longueur de l’une ou l’autre. Maintenant, peu importe la taille des 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 for loop, l’iterator de loop, utilise ce type de fonction d’iterator. La valeur i est l’index de l’entrée dans le tableau. La valeur de name est la valeur à cet index. Donc, cela fait beaucoup de travail pour vous.

En lisant en ligne ( tutoriel sur les tableaux ), il semble que les tables se comportent comme des tableaux.

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 la table index/key , sur vos names tables 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 que i passe de 1 à 3.

Sur Way2, vous spécifiez plutôt 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 les éléments suivants:

 1 John 2 Joe myKey myValue 
 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 de valeur de la table

Essayer:

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