Est-il quelque chose comme des pointeurs en Lua?
Je suis nouveau sur Lua et je veux créer un tableau [do], ce qui permettrait de stocker des valeurs comme:
parent.child[1].value = "whaterver"
parent.child[2].value = "blah"
cependant, le plus souvent il n'y a qu'un seul enfant, de sorte qu'il serait plus facile pour accéder à la valeur comme ceci:
parent.child.value
Pour simplifier les choses, je tiens à conserver mes valeurs, de manière à ce que
parent.child[1].value == parent.child.value
Mais pour ce faire j'aurais pour stocker cette valeur à deux reprises dans la mémoire.
Est-il possible que je pouvais le faire, de sorte que:
parent.child.value points to parent.child[1].value
sans stocker la valeur de deux fois dans la mémoire?
Question est, comment vérifier la quantité de mémoire une table prendre?
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, tous les types (à l'exception des valeurs booléennes, des chiffres et de la lumière userdata) sont des références - si
t
est un tableau et vous net2 = t
, puis les deuxt
ett2
sont des références à la même table dans la mémoire.Deuxième chose - chaîne sont internés dans Lua. Cela signifie que tous l'égalité des chaînes de caractères, comme
"abc"
et le résultat de"ab".."c"
sont en fait une seule chaîne. Lua stocke également les références aux cordes. Donc, vous ne devriez pas vous soucier de la mémoire - il n'existe qu'une seule instance de la chaîne à la fois.Vous pouvez faire en toute sécurité
parent.child.value = parent.child[1].value
, vous devrez utiliser uniquement un mémoire pour un logement dans une table (quelques octets), aucune chaîne ne peut être copié, uniquement référencés.Lua tableaux (souvent utilisés comme des objets) ne sont pas copiés, mais référencés.
(en interne, un pointeur est utilisé pour eux)
C'est une belle application pour l'utilisation de metatables:
Si un index est pas trouvé dans la table enfant (comme "valeur", il se regarda dans le tableau la valeur de __l'indice de la métatable (le premier élément de l'enfant dans ce cas).
Maintenant il y a un problème avec le code ci-dessus nous pouvons voir, comme épouse:
C'est parce que la métatable conserve une référence à la première table enfant, l'empêchant d'être récolté. La solution de contournement pour ce genre de choses est Un) la prise de la métatable une faiblesse de la table, ou B) de permettre l' __champ d'index d'une fonction, au lieu de faire référence à une table.
Si vous êtes vraiment intéressés à lire sur metatables, essayez de lire La programmation en Lua, chapitre 13 et chapitre 17 (faible tables). Lua-les Utilisateurs de wiki sur MetaMethods pourrait aussi être intéressant.
Avec C des tableaux,
parent.child
etparent.child[0]
sont équivalentes à cause de l'arithmétique des pointeurs. Vous ne devriez pas essayer d'imiter l'une des plus sujettes à l'erreur, source de confusion et de fonctions redondantes de la C juste parce que vous aimez le style.