Effizienteste Weg, um festzustellen, ob eine Lua-Tabelle leer ist (keine Einträge enthält)?
Frage
Was ist der effizienteste Weg, um zu bestimmen, ob eine Tabelle leer ist (das heißt, enthält derzeit weder Array-Stil Werte noch dict-style-Wert)?
Zur Zeit verwende ich next()
:
if not next(myTable) then
-- Table is empty
end
Gibt es eine effizientere Art und Weise?
Hinweis: Der #
Betreiber hier nicht ausreicht, da es auf den Array-Stil Werte in der Tabelle funktioniert nur - so ist #{test=2}
von #{}
nicht zu unterscheiden, weil beide Rückkehr 0. Beachten Sie auch, dass geprüft wird, ob die Tabellenvariable nil
sind nicht genügen, da ich nicht für Null-Wert der Suche bin, sondern Tabellen mit 0 Einträgen (dh {}
).
Lösung
Der Code ist effizient, aber falsch. (Man denke {[false]=0}
.) Der richtige Code ist
if next(myTable) == nil then
-- myTable is empty
end
Für eine maximale Effizienz wollen Sie next
auf eine lokale Variable binden, zum Beispiel
...
local next = next
...
... if next(...) ...
Andere Tipps
Eine Möglichkeit wäre, die Anzahl der Elemente zu zählen, durch die Metatabelle „newindex“ Taste. Wenn etwas nicht nil
zuweisen, erhöht den Zähler (der Zähler im Metatabelle auch leben kann), und wenn nil
Zuordnung die Zähler verringern.
Die Prüfung auf leere Tabelle wäre der Zähler mit 0 zu testen.
Hier ist ein Zeiger auf Metatabelle Dokumentation
Ich mag Ihre Lösung aber, und ich kann ehrlich gesagt nicht davon ausgehen, dass meine Lösung ist insgesamt schneller.
Dies ist wahrscheinlich das, was man wollte:
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))
Ausgabe:
true
false
true
Ich weiß, das alt ist, und ich konnte man irgendwie sein Missverständnis, aber es Sie wollen einfach nur die Tabelle leer sein, das heißt, es sei denn, Sie nur überprüft werden, wenn es ist, und Sie nicht wirklich wollen oder müssen es leer sein, können Sie es löschen, indem Sie einfach neu zu erstellen, es sei denn, ich irre. Dies kann mit der folgenden Syntax erfolgen.
yourtablename = {} -- this seems to work for me when I need to clear a table.
besser die Bewertung der __eq zu vermeiden, wenn überlastet ist.
if rawequal(next(myTable), nil) then
-- myTable is empty
end
oder
if type(next(myTable)) == "nil" then
-- myTable is empty
end
try Schlange, Arbeit für mich
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
Wie wäre das?
if endmyTable[1] == nil then
-- myTable is empty
end
Versuchen #
verwenden. Es gibt alle Instanzen, die in einer Tabelle sind. Wenn es keine Instanzen in einer Tabelle ist, dann gibt es 0
if #myTable==0 then
print('There is no instance in this table')
end