La plupart moyen efficace de déterminer si une table Lua est vide (ne contient pas d'entrées)?

StackOverflow https://stackoverflow.com/questions/1252539

  •  12-09-2019
  •  | 
  •  

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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top