Lua - Iterator
Iterator adalah konstruksi yang memungkinkan Anda melintasi elemen yang disebut collection atau container. Dalam Lua, kumpulan ini sering mengacu pada tabel, yang digunakan untuk membuat berbagai struktur data seperti array.
Generik Untuk Iterator
Generik untuk iterator menyediakan pasangan nilai kunci dari setiap elemen dalam koleksi. Contoh sederhana diberikan di bawah ini.
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
Ketika kami menjalankan kode di atas, kami akan mendapatkan output berikut -
1 Lua
2 Tutorial
Contoh di atas menggunakan fungsi iterator ipairs default yang disediakan oleh Lua.
Dalam Lua kami menggunakan fungsi untuk merepresentasikan iterator. Berdasarkan pemeliharaan status dalam fungsi iterator ini, kami memiliki dua tipe utama -
- Iterator tanpa kewarganegaraan
- Iterator Stateful
Iterator tanpa kewarganegaraan
Dengan namanya sendiri kita dapat memahami bahwa jenis fungsi iterator ini tidak mempertahankan status apa pun.
Sekarang mari kita lihat contoh pembuatan iterator kita sendiri menggunakan fungsi sederhana yang mencetak kuadrat n angka.
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
for i,n in square,3,0
do
print(i,n)
end
Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.
1 1
2 4
3 9
Kode di atas dapat sedikit dimodifikasi untuk meniru cara kerja ipairs fungsi iterator. Itu ditunjukkan di bawah ini.
function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end
function squares(iteratorMaxCount)
return square,iteratorMaxCount,0
end
for i,n in squares(3)
do
print(i,n)
end
Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.
1 1
2 4
3 9
Iterator Stateful
Contoh sebelumnya dari iterasi menggunakan fungsi tidak mempertahankan status. Setiap kali fungsi dipanggil, ia mengembalikan elemen koleksi berikutnya berdasarkan variabel kedua yang dikirim ke fungsi. Untuk menahan status elemen saat ini, closure digunakan. Penutupan mempertahankan nilai variabel di seluruh pemanggilan fungsi. Untuk membuat closure baru, kita membuat dua fungsi termasuk closure itu sendiri dan sebuah pabrik, fungsi yang membuat closure.
Sekarang mari kita lihat contoh pembuatan iterator kita sendiri di mana kita akan menggunakan closure.
array = {"Lua", "Tutorial"}
function elementIterator (collection)
local index = 0
local count = #collection
-- The closure function is returned
return function ()
index = index + 1
if index <= count
then
-- return the current element of the iterator
return collection[index]
end
end
end
for element in elementIterator(array)
do
print(element)
end
Saat kita menjalankan program di atas, kita akan mendapatkan output sebagai berikut.
Lua
Tutorial
Dalam contoh di atas, kita dapat melihat bahwa elementIterator memiliki metode lain di dalamnya yang menggunakan indeks variabel eksternal lokal dan menghitung untuk mengembalikan setiap elemen dalam kumpulan dengan menaikkan indeks setiap kali fungsi dipanggil.
Kita dapat membuat iterator fungsi kita sendiri menggunakan closure seperti yang ditunjukkan di atas dan dapat mengembalikan banyak elemen untuk setiap kali kita mengulang melalui koleksi.