2013-07-02 19 views
30

Yani, bu satırlar boyunca bir masa bir şey var: onların endeksine dayalı bunlara erişmek mümkün gibiLua'da tablodan nasıl yineleme yapılır?

arr = 
{ 
    apples = { 'a', "red", 5 }, 
    oranges = { 'o', "orange", 12 }, 
    pears = { 'p', "green", 7 } 
} 

O görünmüyor ve kendilerini tablolar değerler, bu yüzden sadece ilk değer yapılmış İç içe tablo bunun endeksi, şimdi şuna benzer şekilde: Yani

arr = 
{ 
    apples = { 0, 'a', "red", 5 }, 
    oranges = { 1, 'o', "orange", 12 }, 
    pears = { 2, 'p', "green", 7 } 
} 

, şimdi bu tablolardan birini kullanan herhangi bir zaman, ben indeksi ne olduğunu biliyorum, ama yine de alamıyorum indeksi kullanarak tabloyu, böylece bunların hepsinden geçtiği bir işlevi yazmaya başladım ve doğru olanı bulana kadar dizinleri kontrol et. Sonra anladım ki ... eğer onları endeksleriyle ifade edemediğimde onları nasıl çözebilirim? Yani şimdi sıkıştım. Çoğu zaman arr.apples vs arr [1] yazabilmek istiyorum, ama tabii ki her ikisini de yapmak gerekiyor.

+1

Bu @greatwolf gelen cevap bir "" Her dizi satır arasında olmadığı sürece başarısız olacaktır. '' 'arr = { elma = {0, 'a'," kırmızı ", 5}, portakal = {1, 'o'," turuncu ", 12}, armut = {2, 'p', "yeşil", 7}, } '' bir çalışma örneği şu adresten görülebilir: http://ideone.com/yWKHx7 –

+0

@ KjellHedström OP'nin sorusunu düzenledim ve küçük sözdizimi hatalarını düzelttim. İyi yakalama. – greatwolf

cevap

52

sen pairs kullanabileceğiniz bir tablodaki her yerinde anahtar-değer çiftlerini yineleme için:

arr = {} 
apples = {'a', "red", 5 } 
arr.apples = apples 
arr[1] = apples 

Bu kod bloğu bir tablo (http://lua-users.org/wiki/TablesTutorial) tüm anahtar-değer çiftleri arasında yineleme sağlar :

for k, v in pairs(arr) do 
    print(k, v[1], v[2], v[3]) 
end 

çıkışlar:

pears 2 p green 
apples 0 a red 
oranges 1 o orange 

Düzenleme: Lua'nın tablonun ilişkisel kısmı için herhangi bir yineleme siparişini garanti etmediğini unutmayın. Öğelere belirli bir sırayla erişmek istiyorsanız, anahtarları arr'dan alın ve sıralayın. Sonra sıralanmış tuşları aracılığıyla arr eriş:

local ordered_keys = {} 

for k in pairs(arr) do 
    table.insert(ordered_keys, k) 
end 

table.sort(ordered_keys) 
for i = 1, #ordered_keys do 
    local k, v = ordered_keys[i], arr[ ordered_keys[i] ] 
    print(k, v[1], v[2], v[3]) 
end 

çıkışları:

apples a red  5 
    oranges o orange 12 
    pears p green 7 
+0

Sadece farkettim ... neden onları yanlış sırada yazdırıyor? Bunları sırayla basarsa, tablodaki dizin değişkenini dışarıda bırakabilirim ve indeksi bulmak için yazdığı sıraya güvenirim, bu da güzel olurdu. –

+2

Lua, tablonun ilişkisel kısmı için yineleme sırasını garanti etmez. – greatwolf

+1

@Lemony Tabloyu belirli bir sırada nasıl geçebileceğinize dair bir örnek ekledim. – greatwolf

8

İç içe geçmiş bir tablaya birden çok tuşla başvurmak isterseniz, bunları yalnızca ayrı tuşlara atayabilirsiniz. Tablolar çoğaltılmamıştır ve hala aynı değerlere başvurulur.

for k,v in pairs(t) do 
print(k,v) 
end 
İlgili konular