Effizienteste Weg, um festzustellen, ob eine Lua-Tabelle leer ist (keine Einträge enthält)?

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

  •  12-09-2019
  •  | 
  •  

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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top