Masalah Anda sederhana:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Kode ini pertama-tama mendeklarasikan variabel global yang dipanggil names
. Kemudian, Anda memulai pengulangan for. Perulangan for mendeklarasikan variabel lokal yang kebetulan dipanggil names
juga; fakta bahwa variabel sebelumnya telah didefinisikan dengan names
sama sekali tidak relevan. Setiap penggunaan names
di dalam for loop akan merujuk ke penggunaan lokal , bukan global.
Perulangan for mengatakan bahwa bagian dalam dari perulangan akan dipanggil dengan names = 1
, kemudian names = 2
, dan akhirnya names = 3
. Perulangan for mendeklarasikan penghitung yang menghitung dari angka pertama hingga terakhir, dan akan memanggil kode dalam satu kali untuk setiap nilai yang dihitung.
Apa yang sebenarnya Anda inginkan adalah sesuatu seperti ini:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Sintaks [] adalah bagaimana Anda mengakses anggota tabel Lua. Tabel Lua memetakan "kunci" ke "nilai". Array Anda secara otomatis membuat kunci tipe integer, yang meningkat. Jadi kunci yang terkait dengan "Joe" dalam tabel adalah 2 (indeks Lua selalu dimulai dari 1).
Oleh karena itu, Anda memerlukan loop for yang menghitung dari 1 hingga 3, yang Anda dapatkan. Anda menggunakan variabel count untuk mengakses elemen dari tabel.
Namun, ini memiliki kekurangan. Apa yang terjadi jika Anda menghapus salah satu elemen dari daftar?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Sekarang, kita mengerti John Joe nil
, karena mencoba mengakses nilai dari tabel yang tidak ada hasilnya nil
. Untuk mencegahnya, kita perlu menghitung dari 1 sampai panjang meja:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
Ini #
adalah operator panjang. Ini berfungsi pada tabel dan string, mengembalikan panjang keduanya. Sekarang, tidak peduli seberapa besar atau kecilnya names
, ini akan selalu berhasil.
Namun, ada cara yang lebih mudah untuk melakukan iterasi melalui berbagai item:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
adalah fungsi standar Lua yang melakukan iterasi pada daftar. Gaya for
pengulangan ini, pengulangan untuk pengulangan, menggunakan jenis fungsi iterator. The i
nilai adalah indeks entri dalam array. The name
nilai adalah nilai pada indeks itu. Jadi pada dasarnya itu melakukan banyak pekerjaan kasar untuk Anda.
_
ketika var tidak digunakan. misalnyanames = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Dengan membaca online ( tutorial tabel ) tampaknya tabel berperilaku seperti array sehingga Anda mencari:
Cara1
names = {'John', 'Joe', 'Steve'} for i = 1,3 do print( names[i] ) end
Cara2
names = {'John', 'Joe', 'Steve'} for k,v in pairs(names) do print(v) end
Way1 menggunakan tabel
index/key
, di tabel Andanames
setiap elemen memiliki kunci mulai dari 1, misalnya:names = {'John', 'Joe', 'Steve'} print( names[1] ) -- prints John
Jadi Anda hanya membuat
i
pergi dari 1 ke 3.Pada Way2, Anda menentukan tabel apa yang ingin Anda jalankan dan menetapkan variabel untuk kunci dan nilainya misalnya:
names = {'John', 'Joe', myKey="myValue" } for k,v in pairs(names) do print(k,v) end
mencetak yang berikut ini:
1 John 2 Joe myKey myValue
sumber
ipairs
? Atau bagian di manapairs
tidak harus mengembalikan nilai kunci dalam urutan tertentu?ipairs
pada awalnya tetapi ketika saya menambahkanmyKey="myValue"
contoh yang membutuhkanpairs
kunci non-numerik, saya memutuskan untuk mengubah sisanyapairs
juga. Saya minta maaf jika saya menghilangkan bahwa pesanan tidak dijamin dengan pasangan tetapi saya meninggalkan tautan di sana untuk dia baca.names = {'John', 'Joe', 'Steve'} for names = 1, 3 do print (names) end
Mencoba:
names = {'John','Joe','Steve'} for i = 1,3 do print(names[i]) end
sumber
names
(penghitung integer) seperti yang dideklarasikan dalamfor
lingkup memperkenalkan variabel lokal, yang membayanginames
(array tabel) seperti yang dideklarasikan dalam lingkup global.