Domanda
Ho inciampato su un comportamento strano in Lua funzione disfare
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)
Output:
table1: true nil true false nil nil nil
table2: true false nil nil nil nil nil
Il secondo decomprimere fornisce parametri fino al primo valore nullo. Ho potuto vivere con questo. La prima tabella offre 4? parametri con un essere zero nel mezzo. Ha 4 parametri non nullo, ma non sono quello che sono presenti.
Qualcuno potrebbe spiegare questo? Questo è stato provato con codepad.org e lua 5.1
Soluzione
Il problema può essere risolto semplicemente specificando l'inizio e la fine indici per unpack()
e utilizzando la table.maxn()
come l'indice di chiusura
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
La vera ragione di questa differenza di come le due tabelle sono gestiti è nella logica di determinare la lunghezza della porzione di matrice della tabella.
La funzione luaB_unpack()
utilizza luaL_getn()
che è definito in termini di lua_objlen()
che richiede luaH_getn()
per tavoli. Il luaH_getn()
guarda l'ultima posizione dell'array, e se è nil
esegue una ricerca binaria per un confine nella tabella ( "in modo tale che t [i] non è nullo e t [i + 1] è pari a zero"). La ricerca binaria per la fine della matrice è la ragione che table1
viene gestita diversamente quindi table2
.
Questo dovrebbe essere solo un problema se l'ultima voce nella matrice è nil
.
in Lua (pg.16) (si dovrebbe comprare questo libro).: Quando un array presenta fori - nil elementi all'interno di esso - l'operatore lunghezza può assumere uno qualsiasi di questi elementi nil come indicatore di fine. Pertanto, si dovrebbe evitare di utilizzare l'operatore lunghezza su matrici che possono contenere fori.
Il unpack()
utilizza l'operatore lua_objlen()
lunghezza, che "possono assumere uno qualsiasi dei [la] nil elementi come la fine" della matrice.
Altri suggerimenti
[...] Il tipo di tabella implementa associativa array, cioè sistemi che possano essere indicizzato non solo con i numeri, ma con un valore (tranne nil). tabelle può essere eterogenea; vale a dire, hanno può contenere valori di tutti i tipi (Ad eccezione nil) . [...]
nil
Dato a una voce sarà rompere l'enumerazione tavolo e le variabili non sarà init correttamente.
Ecco un semplice esempio che dimostra un problematico comportamento:
table1 = {true, false, nil, false, nil, true, nil}
for k,v in ipairs(table1) do
print(k, v)
end
uscita:
1 true
2 false
>Exit code: 0