Was ist der effizienteste Weg, um festzustellen, ob eine Tabelle leer ist (dh derzeit weder Werte im Array-Stil noch Werte im Diktat-Stil enthält)?
Derzeit verwende ich next()
:
if not next(myTable) then
-- Table is empty
end
Gibt es einen effizienteren Weg?
Hinweis: Der #
Operator reicht hier nicht aus, da er nur mit den Werten im Array-Stil in der Tabelle arbeitet - daher #{test=2}
ist er nicht zu unterscheiden, #{}
da beide 0 zurückgeben. Beachten Sie auch, dass die Überprüfung, ob die Tabellenvariable ist nil
, nicht ausreicht, da ich nicht suche Nullwerte, sondern Tabellen mit 0 Einträgen (dh {}
).
false
wäre dies kein erwarteter Schlüssel, so dass er einwandfreiif not
funktioniert, aber ich werde es mir wahrscheinlich zur Gewohnheit machen, ihnnil
stattdessen in Zukunft zu vergleichen, nur als gute Angewohnheit. Und ja, ich habe allgemeine Dienstprogrammfunktionen aus Geschwindigkeitsgründen an lokale Variablen gebunden. Vielen Dank für die Eingabe.local next
?local next
im aktuellen Block befindet, wird diese verwendet, dann auf den nächsten Block geklettert und wiederholt. Sobald die Einheimischen nicht mehr erreichbar sind, wird nur dann der globale Namespace verwendet. Dies ist eine heruntergekommene Version davon, aber am Ende bedeutet es definitiv den Unterschied in Bezug auf die Programmgeschwindigkeit.Eine Möglichkeit wäre, die Anzahl der Elemente mithilfe des metatierbaren Schlüssels "newindex" zu zählen. Wenn Sie etwas nicht
nil
zuweisen, erhöhen Sie den Zähler (der Zähler könnte auch in der Metatabelle leben) und beim Zuweisennil
, dekrementieren Sie den Zähler, .Das Testen auf eine leere Tabelle würde bedeuten, den Zähler mit 0 zu testen.
Hier ist ein Zeiger auf eine metatierbare Dokumentation
Ihre Lösung gefällt mir jedoch und ich kann ehrlich gesagt nicht davon ausgehen, dass meine Lösung insgesamt schneller ist.
quelle
nil
zugewiesen wird, da __newindex nicht ausgelöst wird, wenn der Schlüssel bereits in der Tabelle vorhanden ist.__index
und__newindex
die tatsächlichen Daten in einer Schattentabelle speichern und die reale Tabelle leer lassen, damit__index
sie überhaupt aufgerufen wird. Wenn ich laut nachdenke, vermute ich, dass sich die erhöhten Kosten für jede einzelne Suche nicht lohnen können.Dies ist wahrscheinlich, was Sie wollten:
Ausgabe:
quelle
next()
ist effizienter (und prägnanter) als das Schleifenpairs()
.pairs()
ist im Wesentlichen nur die Verwendung vonnext()
Technik, aber mit Aufwand mehr.table
wird ebenfalls nicht empfohlen.Vermeiden Sie besser die Auswertung von __eq bei Überlastung.
oder
quelle
versuche es mit der Schlange, arbeite für mich
quelle
Wie wäre es damit ?
quelle
Ich weiß, dass dies alt ist, und ich könnte Sie irgendwie missverstehen, aber Sie möchten nur, dass die Tabelle leer ist, es sei denn, Sie überprüfen nur, ob dies der Fall ist und Sie möchten oder brauchen, dass sie nicht leer ist. Sie können es löschen, indem Sie es einfach neu erstellen, es sei denn, ich irre mich. Dies kann mit der folgenden Syntax erfolgen.
quelle
Versuchen Sie es mit
#
. Es gibt alle Instanzen zurück, die sich in einer Tabelle befinden. Wenn eine Tabelle keine Instanzen enthält, wird sie zurückgegeben0
quelle
#
hier nicht ausreicht, und gibt Gründe dafür an; Können Sie erklären, warum dies diese Gründe umgeht?