Wie erzeugt man das Verhalten von ipairs (im Gegensatz zu Paaren) in der C-API?

8

In Lua können pairs und ipairs über die gleichen Elemente in einer anderen Reihenfolge iterieren:

%Vor%

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?

    
Paul 03.01.2013, 23:53
quelle

2 Antworten

6

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: Ссылка

    
daurnimator 05.01.2013, 14:05
quelle
3
%Vor%

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 .

Lua 5.1 erklärt :

  

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 :

  

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

%Vor%
  

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 .

    
Nicol Bolas 04.01.2013 00:53
quelle

Tags und Links