2016-10-12 1 views
3

je une variable comme suitLooping sur les valeurs de tableau dans Lua

local armies = { 
    [1] = "ARMY_1", 
    [2] = "ARMY_3", 
    [3] = "ARMY_6", 
    [4] = "ARMY_7", 
} 

Maintenant, je veux faire une action pour chaque valeur. Quel est le meilleur moyen de contourner les valeurs? La chose typique je trouve sur Internet est la suivante:

for i, armyName in pairs(armies) do 
    doStuffWithArmyName(armyName) 
end 

Je n'aime pas qu'il en résulte une variable i utilisé. L'approche suivante évite que et est ce que je suis actuellement en utilisant:

for i in pairs(armies) do 
    doStuffWithArmyName(armies[i]) 
end 

Toutefois, elle est toujours pas aussi lisible et simple que je voudrais, puisque c'est itérer sur les touches et obtenir la valeur à l'aide de la touche (plutôt impérativement). Un autre avantage que j'ai avec les deux approches est que pairs est nécessaire. La valeur qui est en boucle ici est celle sur laquelle j'ai le contrôle, et je préférerais qu'elle puisse être bouclée aussi facilement que possible.

Y a-t-il une meilleure façon de faire une telle boucle si je me soucie seulement des valeurs? Existe-t-il un moyen de répondre aux préoccupations que j'ai énumérées?

J'utilise Lua 5.0 (et je suis tout à fait nouveau à la langue)

+0

Peu importe ce que vous faites (même avec un itérateur personnalisé) parce que ** VOUS ** en avez besoin, mais parce que l'itérateur le fait. – warspyking

Répondre

9

La façon idiomatiques itérer sur un tableau est:

for _, armyName in ipairs(armies) do 
    doStuffWithArmyName(armyName) 
end 

Notez que:

  1. Utilisation ipairs sur pairs pour les tableaux
  2. Si la clé ne vous intéresse pas, utilisez _ comme espace réservé.

Si, pour une raison quelconque, que _ espace réservé vous concerne encore, faites votre propre itérateur. programmation en Lua fournit comme un exemple:

function values(t) 
    local i = 0 
    return function() i = i + 1; return t[i] end 
end 

Utilisation: l'index doit être enregistré * quelque part *, non

for v in values(armies) do 
    print(v) 
end