Latest web development tutorials

Lua iterator

Iterator (iterator) adalah obyek yang dapat digunakan untuk melintasi Standard Template Library wadah sebagian atau semua elemen, alamat setiap objek iterator merupakan wadah ditentukan

Di Lua iterator adalah jenis pointer struktur dukungan, yang dapat melintasi setiap elemen dari koleksi.


Generik untuk iterator

Generik untuk pelestarian fungsi berulang internal sendiri, pada kenyataannya, menghemat tiga nilai: fungsi berulang, konstanta negara, variabel kontrol.

Generik untuk iterasi menyediakan satu set pasangan kunci / nilai, sintaks adalah sebagai berikut:

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

Kode di atas, k, v variabel daftar, pasangan (t) untuk daftar ekspresi.

Lihat contoh berikut:

array = {"Lua", "Tutorial"}

for key,value in ipairs(array) 
do
   print(key, value)
end

output kode di atas dijalankan:

1  Lua
2  Tutorial

Contoh di atas kita menggunakan ipairs fungsi berulang Lua disediakan secara default.

Di sini kita melihat proses untuk pelaksanaan Fan:

  • Pertama, menginisialisasi, dihitung nilai setelah ekspresi, ekspresi harus kembali untuk rentang yang diperlukan dari tiga nilai: fungsi berulang, konstanta negara, variabel kontrol, dan multi-nilai tugas, jumlah hasil jika ekspresi mengembalikan kurang dari tiga dengan poin nihil otomatis akan membuat, bagian ekstra akan diabaikan.
  • Kedua, konstanta negara dan variabel kontrol sebagai parameter untuk memanggil fungsi iterator (Catatan: untuk struktur, konstanta negara tidak berguna, hanya mendapatkan nilai ketika diinisialisasi dan diteruskan ke fungsi iterasi).
  • Ketiga, fungsi mengembalikan nilai iterasi ke daftar variabel.
  • Keempat, jika nilai kembali dari nil di akhir pertama loop, jika tubuh loop.
  • Kelima, panggilan kembali ke fungsi langkah iterasi kedua lagi

. Di Lua kita sering menggunakan untuk menggambarkan fungsi iterator, setiap panggilan ke fungsi ini mengembalikan elemen berikutnya dari koleksi. Lua iterator mengandung dua jenis berikut:

  • iterator stateless
  • iterator Multi-negara

iterator stateless

iterator stateless mengacu tidak mempertahankan setiap iterator negara, sehingga kita dapat menggunakan loop iterator stateless menghindari menciptakan penutupan menghabiskan harga tambahan.

Setiap iterasi, fungsi iterasi dua variabel (negara dan kontrol variabel konstan) nilai sebagai parameter yang disebut iterator stateless hanya menggunakan dua nilai tersebut untuk mendapatkan elemen berikutnya.

Sebuah contoh khas seperti iterator stateless sederhana adalah ipairs, ia melalui setiap elemen array.

Contoh berikut kita menggunakan fungsi sederhana untuk mencapai iterator, digital n kuadrat:

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

Contoh di atas output:

1	1
2	4
3	9

negara traversal berulang mencakup meja (selama siklus tidak mengubah keadaan konstan) dan indeks indeks saat ini (variabel kontrol), ipairs dan fungsi berulang sangat sederhana, kita dapat mencapai di Lua:

function iter (a, i)
    i = i + 1
    local v = a[i]
    if v then
       return i, v
    end
end
 
function ipairs (a)
    return iter, a, 0
end

Ketika Lua panggilan ipairs (a) untuk memulai siklus, ia memperoleh tiga nilai: fungsi iter berulang, keadaan konstan, kontrol nilai awal variabel 0; kemudian Lua memanggil iter (a, 0) mengembalikan 1, a [1] (kecuali [1] = nil); iterasi kedua panggilan iter (a, 1) mengembalikan 2, sebuah [2] ...... sampai elemen nihil pertama.


iterator Multi-negara

Dalam banyak kasus, kebutuhan untuk melestarikan sejumlah informasi negara iterator bukan hanya menyatakan konstanta kontrol dan variabel, cara termudah adalah dengan menggunakan penutupan, ada cara untuk merangkum semua informasi negara ke dalam tabel, tabel sebagai berulang status konstanta, karena dalam hal ini semua informasi dapat disimpan dalam tabel, fungsi sehingga berulang biasanya tidak memerlukan parameter kedua.

Contoh berikut kita buat iterator kita sendiri:

array = {"Lua", "Tutorial"}

function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
      index = index + 1
      if index <= count
      then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end

for element in elementIterator(array)
do
   print(element)
end

Contoh di atas output:

Lua
Tutorial

Contoh di atas kita dapat melihat, penggunaan penutupan dalam fungsi elementIterator, dihitung untuk mencapai ukuran set dan output dari setiap elemen.