Quelle est la manière la plus efficace de déterminer si une table est vide (c'est-à-dire qu'elle ne contient actuellement ni valeurs de style tableau ni valeurs de style dict)?
Actuellement, j'utilise next()
:
if not next(myTable) then
-- Table is empty
end
Existe-t-il un moyen plus efficace?
Remarque: L' #
opérateur ne suffit pas ici, car il n'opère que sur les valeurs de style tableau dans la table - il #{test=2}
est donc impossible de distinguer #{}
car les deux renvoient 0. Notez également que vérifier si la variable de table est nil
ne suffit pas car je ne recherche pas valeurs nulles, mais plutôt des tables avec 0 entrées (ie {}
).
false
ce ne serait pas une clé attendue, donc celaif not
fonctionnait bien, mais je prendrai probablement l'habitude de comparer à lanil
place à l'avenir, tout comme une bonne habitude. Et oui, j'ai lié les fonctions utilitaires communes aux variables locales pour la vitesse. Merci pour votre contribution.local next
?local next
dans le bloc actuel, il l'utilisera, puis grimpera au bloc suivant et répétera. Une fois hors des locaux, il n'utilisera alors que l'espace de noms global. Il s'agit d'une version simplifiée de celui-ci, mais en fin de compte, cela signifie définitivement la différence en ce qui concerne la vitesse du programme.Une possibilité serait de compter le nombre d'éléments, en utilisant la clé métatable "newindex". Lors de l'affectation de quelque chose qui ne l'est pas
nil
, incrémentez le compteur (le compteur peut également vivre dans la métatable) et lors de l'assignationnil
, décrémentez le compteur.Tester une table vide serait de tester le compteur avec 0.
Voici un pointeur vers la documentation métatable
Cependant, j'aime votre solution et je ne peux honnêtement pas supposer que ma solution est globalement plus rapide.
la source
nil
est attribué, puisque __newindex ne se déclenche pas si la clé existe déjà dans la table.__index
et__newindex
, stocker les données réelles dans une table fantôme et garder la table réelle vide pour qu'elle__index
soit invoquée du tout. En réfléchissant à haute voix, je soupçonne que le coût élevé de chaque recherche ne peut en valoir la peine.C'est probablement ce que vous vouliez:
Production:
la source
next()
est plus efficace (et plus concis) que le bouclagepairs()
.pairs()
consiste essentiellement à utiliser lanext()
technique, mais avec plus de surcharge.table
bibliothèque standard n'est pas recommandée.mieux vaut éviter l'évaluation de __eq en cas de surcharge.
ou
la source
essaie le serpent, travaille pour moi
la source
Que dis-tu de ça ?
la source
Je sais que c'est vieux, et je pourrais me mal comprendre d'une manière ou d'une autre, mais si vous voulez juste que la table soit vide, c'est-à-dire à moins que vous ne vérifiiez simplement si elle l'est et que vous ne voulez pas ou n'avez pas besoin qu'elle soit vide, vous pouvez l'effacer en le recréant simplement, sauf erreur de ma part. cela peut être fait avec la syntaxe ci-dessous.
la source
Essayez d'utiliser
#
. Il renvoie toutes les instances présentes dans une table. S'il n'y a pas d'instances dans une table, il renvoie0
la source
#
cela ne suffira pas ici, et en donne les raisons; pourriez-vous expliquer pourquoi cela contourne ces raisons?