2 votes

Est-ce que Lua évalue différemment les valeurs des tableaux imbriqués lorsqu'il appelle sa longueur ?

Pour commencer, j'utilise repl.it plutôt que d'avoir Lua sur mon bureau. Cela pourrait être le problème, mais je ne peux pas en être sûr puisque je n'ai pas un accès facile à un autre interpréteur Lua.

J'ai un problème avec un programme plus important, mais le même problème se pose dans l'extrait suivant :

stuff = {}
list = {"hello"}
table.insert(stuff,list)
table.remove(list)
print(unpack(stuff[1]))

Lorsqu'il est exécuté, je m'attends à ce qu'il imprime la table décompressée trouvée à l'adresse suivante stuff[1] qui devrait être "hello" parce que c'est la valeur de list quand je l'ai réglé. L'utilisation de la méthode préférée d'insertion et de suppression, vue ci-dessous, donne les mêmes résultats.

test = {}
help = {"hello"}
test[#test+1] = help
help[#help] = nil
print(unpack(test[1]))

Cependant, si je n'appelle pas la longueur mais utilise un nombre magique ou une constante, cela fonctionne parfaitement, comme dans les deux exemples ci-dessous.

what = {}
the = {"hello"}
what[1] = the
the = nil
print(unpack(what[1]))

how = {}
questionmark = {"hello"}
one = 1
what[one] = questionmark
questionmark = nil
print(unpack(what[one]))

Enfin, ce problème n'est pas présent lorsqu'on n'utilise pas de tableaux imbriqués, comme dans cet exemple :

notnested = {}
nottable = "hello"
notnested[#notnested+1] = nottable
nottable = nil
print(notnested[1])

Qu'est-ce qui se passe ici ? Est-ce que je comprends mal le timing des déclarations, est-ce que je fais quelque chose de mal, ou est-ce que repl.it/Lua est en faute ?

C'est le repl.it des cinq exemples ci-dessus : https://repl.it/@typhirz/LightsalmonDenseCodeview

0voto

Nicol Bolas Points 133791
table.remove(list)
help[#help] = nil

Ce n'est pas la même chose que ça :

the = nil

Les deux premiers manipulent le tableau stockée dans la variable list / help . Le deuxième est tout simplement nul. variable the . La table stockée dans list / help a également été stocké dans la table stuff / test .

Les changements apportés à une variable sont différents des changements apportés à la table. stocké dans la variable.

0voto

typhirz Points 29

Nicol Bolas ci-dessous a fourni un aperçu qui a conduit à ma solution dans mon programme plus vaste. Au lieu de stuff[1] = list J'ai utilisé stuff[1] = {unpack(list)} ce qui l'a obligé à créer un nouveau tableau, distinct de celui de la list qui m'a permis de manipuler list plus tard sans changer quoi que ce soit à l'intérieur de stuff . Comme il s'agit d'une copie superficielle, cela ne fonctionne pas dans tous les cas (notamment s'il y a d'autres imbrications), il faut donc plutôt s'intéresser aux copies profondes pour une solution plus robuste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X