Cela ressemble à une question "laissez-moi google pour vous", mais je ne trouve pas de réponse. L' #
opérateur Lua ne compte que les entrées avec des clés entières, de même que table.getn
:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
Comment obtenir le nombre de toutes les entrées sans les compter?
dictionary[value] = #dictionary + 1
, où#
représente le nombre de tous les objets. Ce que je me demande, c'est pourquoi vous ne voulez pas ceci: dans tous les cas d'utilisation sains de # (voir la réponse de kaizer.se), le nombre de tous les objets est exactement égal à ce que # renvoie déjà; il semble que faire # tout compter est strictement une amélioration. Bien sûr, je suis un débutant Lua et je manque peut-être le point.#
opérateur est simplement mal défini. C'est si facile à corriger: premièrement, rendez#
déterministe, et deuxièmement, introduisez un nouvel opérateur ou une nouvelle fonction pour obtenir le sacré nombre. Fin de l'histoire ... Pourquoi doivent-ils être si têtus? :)Réponses:
Vous avez déjà la solution dans la question - le seul moyen est d'itérer toute la table avec
pairs(..)
.Notez également que la définition de l'opérateur "#" est un peu plus compliquée que cela. Permettez-moi d'illustrer cela en prenant ce tableau:
Selon le manuel, l' un des 3, 5 et 9 sont des résultats valides pour
#t
. La seule façon sensée de l'utiliser est avec des tableaux d'une partie contiguë sans valeurs nulles.la source
#
n'est pas déterministe.According to the manual, any of 3, 5 and 9 are valid results for #t
. Selon le manuel, appeler # sur des non-séquences n'est pas défini . Cela signifie que tout résultat (-1, 3, 3.14, 5, 9) est valide.Vous pouvez configurer une méta-table pour suivre le nombre d'entrées, cela peut être plus rapide qu'une itération si ces informations sont fréquemment nécessaires.
la source
Il y a un moyen, mais cela peut être décevant: utilisez une variable supplémentaire (ou l'un des champs de la table) pour stocker le nombre, et augmentez-le à chaque fois que vous faites une insertion.
Il n'y a pas d'autre moyen, l'opérateur # ne fonctionnera que sur des tables de type tableau avec des clés consécutives.
la source
Le moyen le plus simple que je connaisse pour obtenir le nombre d'entrées dans une table est d'utiliser «#». #tableName obtient le nombre d'entrées tant qu'elles sont numérotées:
Malheureusement, s'ils ne sont pas numérotés, cela ne fonctionnera pas.
la source
Vous pouvez utiliser la bibliothèque penlight . Cela a une fonction
size
qui donne la taille réelle de la table.Il a implémenté de nombreuses fonctions dont nous pourrions avoir besoin lors de la programmation et manquantes dans Lua.
Voici l'exemple pour l'utiliser.
la source
la source
__newindex
n'appelle que lorsqu'une nouvelle clé est définie, il n'y a donc aucune chance d'appeler__newindex
lorsque nous définissonsnil
sur une clé existe.apparaît lorsque les éléments de la table sont ajoutés par la méthode insert, getn retournera correctement. Sinon, il faut compter tous les éléments
Il imprimera 2 correctement
la source