La plupart moyen efficace de déterminer si une table Lua est vide (ne contient pas d'entrées)?
Question
Quelle est la façon la plus efficace de déterminer si une table est vide (qui est, contient actuellement pas des valeurs de style de tableau, ni les valeurs de type dict)?
À l'heure actuelle, j'utilise next()
:
if not next(myTable) then
-- Table is empty
end
Y at-il un moyen plus efficace?
Note: L'opérateur #
ne suffit pas ici, car il ne fonctionne que sur les valeurs de style de tableau dans la table - ainsi #{test=2}
ne se distingue pas de #{}
parce que les deux retour 0. Notez également que vérifier si la variable de table est nil
ne il suffit que je ne suis pas à la recherche de valeurs nulles, mais plutôt des tables avec 0 entrées (c.-à-{}
).
La solution
Votre code est efficace mais mal. (Pensez à {[false]=0}
.) Le code correct est
if next(myTable) == nil then
-- myTable is empty
end
Pour une efficacité maximale, vous aurez envie de lier next
à une variable locale, par exemple,
...
local next = next
...
... if next(...) ...
Autres conseils
Une possibilité serait de compter le nombre d'éléments, en utilisant la touche métatable « de newindex ». Lors de l'attribution quelque chose de pas nil
, incrémenter le compteur (le compteur pourrait vivre dans le métatable aussi bien) et lors de l'attribution nil
, décrémenter le compteur.
Test de table vide serait de tester le compteur avec 0.
Voici un pointeur vers documentation métatable
Je fais comme votre solution si, et honnêtement, je ne peux pas supposer que ma solution est globalement plus rapide.
Ceci est probablement ce que vous vouliez:
function table.empty (self)
for _, _ in pairs(self) do
return false
end
return true
end
a = { }
print(table.empty(a))
a["hi"] = 2
print(table.empty(a))
a["hi"] = nil
print(table.empty(a))
Sortie:
true
false
true
Je sais que c'est vieux, et je pourrais être tout malentendu, en quelque sorte, mais vous voulez juste la table à vide, qui est, à moins que vous en train de vérifier si elle est et vous ne voulez pas vraiment ou besoin pour être vide, vous pouvez l'effacer en recréant simplement, à moins que je me trompe. cela peut être fait avec la syntaxe ci-dessous.
yourtablename = {} -- this seems to work for me when I need to clear a table.
mieux éviter l'évaluation des __eq en cas de surcharge.
if rawequal(next(myTable), nil) then
-- myTable is empty
end
ou
if type(next(myTable)) == "nil" then
-- myTable is empty
end
serpent essayer, travailler pour moi
serpent = require 'serpent'
function vtext(value)
return serpent.block(value, {comment=false})
end
myTable = {}
if type(myTable) == 'table' and vtext(myTable) == '{}' then
-- myTable is empty
end
Comment cela?
if endmyTable[1] == nil then
-- myTable is empty
end
Essayez d'utiliser #
. Elle renvoie toutes les instances qui se trouvent dans une table. S'il n'y a pas des cas dans une table, puis il retourne 0
if #myTable==0 then
print('There is no instance in this table')
end