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

È stato utile?

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

2.2 - Valori e tipi

  

[...]   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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top