Quelle est la façon 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?
Noter la #
L'opérateur ne suffit pas ici, car il ne fonctionne que sur les valeurs de style tableau de la table - donc #{test=2}
ne se distingue pas de #{}
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 de valeurs nulles, mais plutôt des tables avec 0 entrées (c'est-à-dire {}
).
Votre code est efficace mais faux. (Considérer {[false]=0}
.) Le code correct est
if next(myTable) == nil then
-- myTable is empty
end
Pour une efficacité maximale, vous voudrez lier next
à une variable locale, par exemple,
...
local next = next
...
... if next(...) ...
Une possibilité serait de compter le nombre d'éléments, en utilisant la clé métatable "newindex". Lorsque vous affectez quelque chose qui n'est pas nil
, incrémentez le compteur (le compteur peut également vivre dans la métatable) et lorsque vous affectez nil
, décrémentez le compteur.
Tester une table vide reviendrait à tester le compteur avec 0.
Voici un pointeur vers documentation métatable
J'aime bien votre solution, et je ne peux honnêtement pas supposer que ma solution est globalement plus rapide.
Que dis-tu de ça ?
if endmyTable[1] == nil then
-- myTable is empty
end
C'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