2015-12-03 1 views
4

Je ne sais pas comment, mais nous avons réussi à créer une table avec deux clés exactement les mêmes. Lorsque vous effectuez boucle for sur pairs de la table et les touches d'impression et les valeurs que nous obtenons:Lua table - deux entrées avec la même clé

1 true 
1 true 

et nous avons pensé que peut-être il est une question de différents types ou quelque chose, alors nous avons décidé de le convertir en JSON (nous utilisons SDK Corona et le module json interne).

Le résultat est assez étonnant:

"ourTable" : { "1" : true, "1" : true } 

Nous avons stocké dans un fichier afin de vérifier les valeurs et les valeurs hexagonales de "1" étaient 31.

Donc un autre test: convertir ce json en table lua et ... même résultat que précédemment: deux entrées avec la même clé.

Je n'ai jamais rien vu de tel auparavant et pour être honnête, je ne sais pas comment détecter et prévenir une telle situation. Nous utilisons Lua & corona depuis quelques années et c'est la première fois que nous détectons quelque chose comme ça, mais il est possible que cela soit déjà arrivé auparavant et nous ne l'avons pas détecté. Cela pourrait conduire à des résultats incroyablement foutus.

Corona SDK utilise Lua 5.1.

Nous stockons cette table json encodée dans un fichier. Après le redémarrage de l'application, le fichier a été chargé à nouveau et il ne contenait qu'une seule entrée! Maintenant ... cette table ne contenait que "id" et boolean, les deux valeurs sont exactement les mêmes, mais je me demande ce qui se passerait si les valeurs étaient différentes, laquelle resterait? Des tonnes de scénarios me viennent à l'esprit maintenant.

Je ne peux pas reproduire ce problème, mais ce que nous faisons:

  1. fichier Lire JSON
  2. Decode JSON dans la table Lua
  3. Ajouter/entrée de mise à jour dans le tableau, il suffit tab[key] = value
  4. Enregistrer le fichier

EDIT: Eh bien, voici maintenant pour reproduire le numéro:

local d = {true} 
d["1"]=true 
for k,v in pairs(d) do 
    print(k,v) 
end 


1 true 
1 true 

Répondre

8

En fait, après avoir ajouté le moyen de reproduire le problème, il était évident que ce qui s'est passé. La table est devenue mixte.

Quand je l'ai fait:

for k,v in pairs(d) do 
    print(k,v, type(k)) 
end 

tout fait sens:

1 true number 
1 true string 

Le seul problème que nous avons maintenant est que le module json dans Corona SDK a changé le numéro 1 en chaîne "1".