Frage
Ich habe auf einem seltsamen Verhalten in Lua auspacken Funktion gestolpert
table1 = {true, nil, true, false, nil, true, nil}
table2 = {true, false, nil, false, nil, true, nil}
a1,b1,c1,d1,e1,f1,g1 = unpack( table1 )
print ("table1:",a1,b1,c1,d1,e1,f1,g1)
a2,b2,c2,d2,e2,f2,g2 = unpack( table2 )
print ("table2:",a2,b2,c2,d2,e2,f2,g2)
Ausgabe:
table1: true nil true false nil nil nil
table2: true false nil nil nil nil nil
Die zweite auspacken liefert Parameter bis zum ersten Nullwert. Ich könnte damit leben. Die erste Tabelle liefert 4? Parameter mit einem Wesen Null in der Mitte. Es verfügt über 4 Parameter, die nicht gleich Null sind, aber sie sind nicht die, die gezeigt werden.
Könnte das jemand erklären? Dies wurde versucht, mit codepad.org und lua 5.1
Lösung
Das Problem behoben einfach den Anfang mit der Angabe und endet Indizes werden kann, die unpack()
als Ending Index table.maxn()
und mit:
table1 = {true, nil, true, false, nil, true, nil} a1,b1,c1,d1,e1,f1,g1 = unpack( table1, 1, table.maxn(table1) ) print ("table1:",a1,b1,c1,d1,e1,f1,g1) -->table1: true nil true false nil true nil
Der wahre Grund für die Diskrepanz auf, wie die beiden Tabellen behandelt werden, ist in der Logik der Länge des Arrays Teils der Tabelle zu bestimmen.
Die luaB_unpack()
Funktion verwendet luaL_getn()
, die in Bezug auf die lua_objlen()
definiert ist, die luaH_getn()
für Tabellen aufruft. Die luaH_getn()
sieht an der letzten Position des Arrays, und wenn es nil
führt eine binäre Suche nach einer Grenze in der Tabelle ( „so, dass t [i] ist Nicht-Null und t [i + 1] ist gleich Null“). Die binäre Suche nach dem Ende des Arrays ist der Grund, dass table1
anders gehandhabt wird dann table2
.
Dies sollte nur ein Problem, wenn der letzte Eintrag in dem Array nil
ist.
Programmierung in Lua (pg.16) (sollten Sie kaufen Sie dieses Buch).: Wenn ein Array Löcher hat - nil Elemente im Inneren - die Länge des Bedieners jeder dieser Null-Elemente als Endmarkierung annehmen kann. Daher sollten Sie die Länge Operator auf Arrays vermeiden verwenden, die Löcher enthalten.
Die unpack()
die Länge Operator lua_objlen()
verwendet, die aus dem Array „mit einer [der] nil Elemente als das Ende annehmen kann.“
Andere Tipps
[...] Der Typ Tabelle implementiert assoziativen Arrays, das heißt, die Arrays sein können nicht nur mit Zahlen indiziert, aber mit einem beliebigen Wert (außer null). Tische kann heterogen; das heißt, sie können die Werte aller Art enthalten (Außer null) . [...]
Da nil
auf einen Eintrag wird brechen die Tabelle Aufzählung und Ihre Variablen werden nicht richtig init werden.
Hier ist ein einfaches Beispiel, das ein problematisch Verhalten zeigt:
table1 = {true, false, nil, false, nil, true, nil}
for k,v in ipairs(table1) do
print(k, v)
end
Ausgabe:
1 true
2 false
>Exit code: 0