web-dev-qa-db-fra.com

Le moyen le plus efficace pour déterminer si une table Lua est vide (ne contient aucune entrée)?

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 {}).

112
Amber

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(...) ...
136
Norman Ramsey

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.

1
0x6adb015

Que dis-tu de ça ?

if endmyTable[1] == nil then
  -- myTable is empty
end
0
Venkat Reddy

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
0
FichteFoll