2015-01-09 16 views
5

Orijinal tabloyu değiştirmeden birkaç alt tablo içeren bir Lua tablosunu iki tabloya nasıl bölebilirim?Alt tabloları içeren bir Lua tablosu nasıl bölülür

örn. subtbl1 = {{tbl1}, {tbl2}}, subtbl2 = {{tbl3}, {tbl4}} ürününü tbl ürününü değiştirmeden bırakarak tbl = {{tbl1}, {tbl2}, {tbl3}, {tbl4}} numaralı bölüme ayırın.

Dize, string.sub ürününe sahiptir, ancak tablonun benzer bir şey olup olmadığını bilmiyorum. Benim durumum için unpack çalışır sanmıyorum, ayrıca table.remove orijinal tbl değiştirecektir.

benim gerçek durum için bilgi ekleme:

tbl çalışma anında alt tablolar ve alt tablolar değişikliklerinin sayısı ile doldurulur. İlk 2 alt tabloyu bir şey için saklamak ve alt tabloların geri kalanını (bir tabloda) bir işleve geçirmek istiyorum.

+0

İkinci işlev, bir tablo tablosunu (dizin 1'den başlayarak) bekliyor? İlk iki alt tabloyu içermesi * için * tbl 'istiyor musun? –

+0

Evet, ikinci işlev, dizin 1'den başlayarak bir tablo tablosu bekler. Ancak, ilk iki alt tablo bir tablo olarak gerekli değildir. Sadece ilk iki alt tablodan bilgi almak zorundayım. – mile

cevap

6

Sen yöntem lhf önerdi kullanarak ilk iki alt tablo tutabilir. Kalan alt tablolarda unpack olabilir.

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', endeksleri başlatma ve bitirme argümanlarını destekler,' select''e gerek yoktur. Sadece '' açmak (t, 3) '. –

+0

@EtanReisner Geri bildirim için teşekkürler. Önerilerinizi dahil etmek için cevabımı güncelledim. – Adam

+0

Teşekkürler beyler! {unpack (t, 3)}, benim durumum için harika. – mile

2

bu deneyin:

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

Teşekkür ederim, ama benim durumum daha karmaşık. Sahip olduğum gerçek durum, orijinal tbl'ın çalışma zamanında alt tablolarla doldurulmasıdır. Amaç, ilk 2 dışında kalan alt tabloların geri kalanını bir işleve aktarmaktır ve ilk 2 alt tablo başka bir yerde kullanılır, böylece orijinal tablonun doldurulduktan sonra değiştirilmesi beklenmez. – mile