2015-01-09 13 views
5

Jak podzielić tabelę Lua zawierającą kilka tabel podrzędnych na dwie tabele bez zmiany oryginalnej tabeli.Jak podzielić tabelę Lua zawierającą podtabeli

np. Podział tbl = {{tbl1}, {tbl2}, {tbl3}, {tbl4}} na subtbl1 = {{tbl1}, {tbl2}}, subtbl2 = {{tbl3}, {tbl4}} przy zachowaniu tbl bez zmian.

Ciąg ma string.sub, ale nie wiem, czy tabela ma coś podobnego. Nie sądzę, że unpack działa w moim przypadku, a także table.remove zmieni oryginalny plik tbl.

Dodajesz więcej informacji o moim prawdziwym przypadku:

tbl wypełniony jest sub-tabel w czasie wykonywania i liczby zmian sub-tabel. Chcę zachować dwie pierwsze podtabeli dla czegoś i przekazać resztę pod-tabel (w jednej tabeli) do funkcji.

+0

Druga funkcja oczekuje tabeli tabel (począwszy od indeksu 1)? Chcesz, aby 'tbl' zawierał * tylko * pierwsze dwie pod-tabele? –

+0

Tak, druga funkcja oczekuje tabeli tabel zaczynającej się od indeksu 1. Ale dwie pierwsze podtabeli nie są potrzebne jako tabela. Muszę tylko pobrać informacje z dwóch pierwszych pod-tabel. – mile

Odpowiedz

6

Możesz zachować pierwsze dwa sub-tabel przy użyciu metoda LHF sugerowane. Możesz wtedy unpack pozostałe stoliki podrzędne.

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' obsługuje argumenty dla początkowych i końcowych indeksów, bez potrzeby" wybierz ". Po prostu "rozpakuj (t, 3)". –

+0

@EtanReisner Dzięki za opinię. Zaktualizowałem swoją odpowiedź, aby uwzględnić Twoją sugestię. – Adam

+0

Dziękuję wam! {Rozpakuj (t, 3)} jest świetny w moim przypadku. – mile

2

Spróbuj tego:

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

Dziękuję, ale moja sprawa jest bardziej skomplikowana. Prawdziwym przypadkiem, jaki mam, jest to, że oryginalny tbl jest wypełniony podtablicami w czasie wykonywania. Celem jest przekazanie reszty podległych tabel z wyjątkiem pierwszych 2 do funkcji, a pierwsze 2 pod-tabelki są używane gdzie indziej, więc pierwotna tabela nie powinna być modyfikowana po jej wypełnieniu. – mile