Klingt nach einer Frage "Lass es mich für dich googeln", aber irgendwie kann ich keine Antwort finden. Der Lua- #
Operator zählt nur Einträge mit Ganzzahlschlüsseln, und zwar auch table.getn
:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
Wie erhalte ich die Anzahl aller Einträge, ohne sie zu zählen?
dictionary[value] = #dictionary + 1
, wo#
die Anzahl der repräsentiert alle Objekte. Was ich frage mich, warum Sie nicht diese wollen: in allen vernünftigen Anwendungsfälle für # (siehe Antwort von kaizer.se), die Anzahl aller Objekte genau gleich was # bereits zurückkehrt; Es scheint, als wäre es eine Verbesserung, # alles zählen zu lassen. Natürlich bin ich ein Lua-Neuling und könnte den Punkt verfehlen.#
Operator nur schlecht definiert. Dies ist so einfach zu beheben: Erstens#
deterministisch machen und zweitens einen neuen Operator oder eine neue Funktion einführen, um die verdammte Anzahl zu erhalten. Ende der Geschichte ... Warum müssen sie so stur sein? :)Antworten:
Sie haben bereits die Lösung in der Frage - die einzige Möglichkeit besteht darin, die gesamte Tabelle mit zu iterieren
pairs(..)
.Beachten Sie auch, dass die Definition des Operators "#" etwas komplizierter ist. Lassen Sie mich das anhand dieser Tabelle veranschaulichen:
Gemäß dem Handbuch, jeder von 3, 5 und 9 sind gültige Ergebnisse für
#t
. Die einzig vernünftige Möglichkeit, es zu verwenden, sind Arrays eines zusammenhängenden Teils ohne Nullwerte.quelle
#
nicht deterministisch ist.According to the manual, any of 3, 5 and 9 are valid results for #t
. Laut Handbuch ist das Aufrufen von # für Nichtsequenzen undefiniert . Das bedeutet, dass jedes Ergebnis (-1, 3, 3.14, 5, 9) gültig ist.Sie können eine Metatabelle einrichten, um die Anzahl der Einträge zu verfolgen. Dies ist möglicherweise schneller als die Iteration, wenn diese Informationen häufig benötigt werden.
quelle
Es gibt einen Weg, der jedoch enttäuschend sein kann: Verwenden Sie eine zusätzliche Variable (oder eines der Tabellenfelder) zum Speichern der Anzahl und erhöhen Sie sie jedes Mal, wenn Sie eine Einfügung vornehmen.
Es gibt keine andere Möglichkeit, der Operator # funktioniert nur bei Array-ähnlichen Tabellen mit aufeinanderfolgenden Schlüsseln.
quelle
Sie könnten die Taschenlampenbibliothek verwenden . Dies hat eine Funktion,
size
die die tatsächliche Größe der Tabelle angibt.Es hat viele der Funktionen implementiert, die wir möglicherweise beim Programmieren benötigen und die in Lua fehlen.
Hier ist das Beispiel für die Verwendung.
quelle
quelle
__newindex
Rufen Sie nur auf, wenn ein neuer Schlüssel definiert ist. Daher besteht keine Möglichkeit zum Aufrufen,__newindex
wennnil
ein vorhandener Schlüssel festgelegt ist.Der einfachste Weg, die Anzahl der Einträge in einer Tabelle zu ermitteln, ist mit '#'. #tableName erhält die Anzahl der Einträge, solange sie nummeriert sind:
Leider funktioniert es nicht, wenn sie nicht nummeriert sind.
quelle
Wenn die Elemente der Tabelle mit der Einfügemethode hinzugefügt werden, wird getn anscheinend korrekt zurückgegeben. Ansonsten müssen wir alle Elemente zählen
Es werden 2 korrekt gedruckt
quelle