2015-01-09 10 views
5

Come posso dividere una tabella Lua contenente pochi sotto-tabelle in due tabelle senza modificare la tabella originale.Come dividere una tabella Lua contenente sotto-tabelle

ad es. dividere tbl = {{tbl1}, {tbl2}, {tbl3}, {tbl4}} in subtbl1 = {{tbl1}, {tbl2}}, subtbl2 = {{tbl3}, {tbl4}} mantenendo tbl invariato.

La stringa ha string.sub, ma non so se la tabella ha qualcosa di simile. Non penso che unpack funzioni per il mio caso, anche table.remove cambierà l'originale tbl.

Aggiunta di ulteriori informazioni per il mio caso reale:

Il tbl è riempito con sub-tavoli in fase di esecuzione e il numero di cambiamenti sotto-tavoli. Voglio mantenere le prime 2 sotto tabelle per qualcosa e passare il resto delle sotto tabelle (in una tabella) a una funzione.

+0

La seconda funzione prevede una tabella di tabelle (a partire dall'indice 1)? Vuoi 'tbl' per contenere * solo * i primi due sotto-tavoli? –

+0

Sì, la seconda funzione prevede una tabella di tabelle a partire dall'indice 1. Ma le prime due sotto tabelle non sono necessarie come tabella. Devo solo recuperare le informazioni dalle prime due sotto tabelle. – mile

risposta

6

È possibile mantenere le prime due sotto-tabelle utilizzando il metodo LHF suggerito. Potresti quindi unpack le rimanenti sotto-tabelle.

local unpack = table.unpack or unpack 

local t = { {1}, {2}, {3}, {4}, {5}, {6} } 

local t1 = { t[1], t[2] } -- keep the first two subtables 
local t2 = { unpack(t, 3) } -- unpack the rest into a new table 

-- check that t has been split into two sub-tables leaving the original unchanged 
assert(#t == 6, 't has been modified') 

-- t1 contains the first two sub-tables of t 
assert(#t1 == 2, 'invalid table1 length') 
assert(t[1] == t1[1], 'table1 mismatch at index 1') 
assert(t[2] == t1[2], 'table1 mismatch at index 2') 

-- t2 contains the remaining sub-tables in t 
assert(#t2 == 4, 'invalid table2 length') 
assert(t[3] == t2[1], 'table2 mismatch at index 1') 
assert(t[4] == t2[2], 'table2 mismatch at index 2') 
assert(t[5] == t2[3], 'table2 mismatch at index 3') 
assert(t[6] == t2[4], 'table2 mismatch at index 4') 
+1

'unpack' supporta argomenti per l'avvio e la fine di indici, non c'è bisogno di' select'. Basta 'spacchettare (t, 3)'. –

+0

@EtanReisner Grazie per il feedback. Ho aggiornato la mia risposta per incorporare il tuo suggerimento. – Adam

+0

Grazie ragazzi! {unpack (t, 3)} è ottimo per il mio caso. – mile

2

Prova questo:

subtbl1 = { tbl[1], tbl[2] } 
subtbl2 = { tbl[3], tbl[4] } 
+0

Grazie, ma il mio caso è più complicato. Il caso reale che ho è che il tbl originale è pieno di sotto-tabelle in fase di esecuzione. L'obiettivo è di passare il resto delle sotto tabelle tranne il primo 2 ad una funzione, e le prime due sotto-tabelle sono usate altrove, quindi la tabella originale non dovrebbe essere modificata dopo essere stata riempita. – mile