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

War es hilfreich?

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

2.2 - Werte und Typen

  

[...]   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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top