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.