web-dev-qa-db-fra.com

Boucle "Pour chaque" dans une table lua avec paires de valeurs clés

Disons que j'ai une table définie comme ceci:

myTable = { myValue = nil, myOtherValue = nil}

Comment pourrais-je le parcourir dans une boucle pour chaque mode comme celle-ci?

  for key,value in myTable do --pseudocode
        value = "foobar"
  end

De plus, si cela aide, je ne me soucie pas vraiment de la clé, juste de la valeur.

18
sFuller

Les clés qui n'ont pas de valeur (ie: sont nil) n'existent pas. myTable est une table vide pour Lua.

Vous pouvez parcourir une table vide, mais cela ne sera pas utile.

En outre:

for key,value in myTable do --pseudocode
    value = "foobar"
end

Ce "pseudocode" n'a aucun sens. Vous ne pouvez pas modifier une table en modifiant le contenu d'une variable locale; Lua ne fonctionne pas de cette façon. Vous ne pouvez pas obtenir une référence à une entrée de table; vous ne pouvez obtenir que valeur dans le tableau.

Si vous souhaitez modifier le contenu d'une table, vous devez réellement modifier la table. Par exemple:

for key,value in pairs(myTable) do --actualcode
    myTable[key] = "foobar"
end

Remarquez l'utilisation de myTable. Vous ne pouvez pas modifier une table sans utiliser la table elle-même à un moment donné. Que ce soit la table accessible via myTable ou via une autre variable dans laquelle vous stockez une référence à la table.

En général, la modification d'une table pendant son itération peut provoquer des problèmes. Cependant, Lua dit:

Le comportement de next n'est pas défini si, pendant la traversée, vous affectez une valeur à un champ inexistant dans la table. Vous pouvez cependant modifier les champs existants. En particulier, vous pouvez effacer les champs existants.

Il est donc parfaitement valable de modifier la valeur d'un champ qui existe déjà. Et key existe déjà dans le tableau, vous pouvez donc le modifier. Vous pouvez même le régler sur nil sans aucun problème.

Les variables de Lua ne sont rien d'autre que des détenteurs de valeurs. Les tableaux contiennent des valeurs; myTable[key] renvoie une valeur. Vous pouvez stocker cette valeur dans une variable, mais la modification de la variable pas changera la valeur de myTable[key]. Étant donné que les tables sont stockées par référence, vous pouvez modifier le contenu de la table dans une variable et voir les modifications dans une autre, mais il s'agit simplement du conten de la table, pas de la table elle-même.

44
Nicol Bolas