In Lua können pairs
und ipairs
über die gleichen Elemente in einer anderen Reihenfolge iterieren:
Wenn ich die C-API verwende, sehe ich nur ein Werkzeug, um über eine Tabelle zu iterieren: die lua_next () Funktion, die sehr ähnlich der Funktion pairs()
Lua wirkt, die die oben gezeigte 2-1-3-Reihenfolge erzeugt.
Ich suche nach einer effizienten C-Methode zum sequentiellen Iterieren über die Ganzzahlschlüssel einer Tabelle (eine C-API-Version von ipairs).
Naiv dachte ich:
%Vor%Ich bin mir jedoch nicht sicher, ob die Tabellengröße nicht mit der Anzahl der aufeinanderfolgenden Ganzzahlschlüssel übereinstimmt:
%Vor%Wenn dies tatsächlich die Art und Weise ist, wie ipairs es tut, gibt es dann einen einfachen Weg, lua_next mit dem letzten gefundenen Integer-Schlüssel zu benutzen, um den Rest der Tabelle weiter zu laufen, ohne den Integer-Schlüssel-Teil zu durchlaufen? Gibt es eine Chance, dass ich einige Integer-Schlüssel zweimal sehen werde?
Sie benutzen einfach Rawgeti, bis Sie einen NULL-Schlüssel erhalten:
%Vor%Wenn Sie sich die Quelle ansehen, können Sie sehen, dass ipairs dies intern tut: Ссылка
Nun, da ist dein Problem genau dort; das hat keine Länge von 4. Sie könnten denken und #t
könnte 4 zurückgeben. Aber was die Lua-API betrifft, ist die Länge dieser Tabelle undefiniert .
Die Länge einer Tabelle t ist definiert als irgendein ganzzahliger Index n, so dass t [n] nicht Null ist und t [n + 1] Null ist; Darüber hinaus, wenn 1 gleich null ist, kann n null sein. Für ein normales Array mit Nicht-Null-Werten von 1 bis zu einem gegebenen n ist seine Länge genau das n, der Index seines letzten Wertes. Wenn das Array "Löcher" aufweist (dh keine Werte zwischen anderen Nicht-Null-Werten), kann #t jeder der Indizes sein, die direkt einem Nullwert vorangestellt sind (d. H., Es kann einen beliebigen Nullwert als Ende betrachten des Arrays).
Lua 5.2 ist etwas expliziter :
%Vor%Die Länge einer Tabelle t ist nur definiert, wenn die Tabelle eine Sequenz ist, dh die Menge ihrer positiven numerischen Schlüssel ist für eine ganze Zahl n gleich {1..n}. In diesem Fall ist n seine Länge. Beachten Sie, dass eine Tabelle wie
ist keine Sequenz, weil es die Taste 4 hat, aber nicht die Taste 3. (Also gibt es kein n, so dass die Menge {1..n} gleich der Menge der positiven numerischen Tasten ist Tabelle.) Beachten Sie jedoch, dass nicht-numerische Schlüssel nicht stören, ob eine Tabelle eine Sequenz ist.
Aber in beiden Fällen ist die Länge undefiniert .