Iterator Berkeadaan dengan Closure
Bangun iterator yang mempertahankan keadaan antar-pemanggilan menggunakan closure.
Iterator Berkeadaan dengan Closure adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Saat Fungsi Penutup Membantu
Saat pengiterasi perlu mempertahankan keadaan yang kompleks dan terus berubah (posisi, tumpukan, riwayat), fungsi penutup adalah alat yang tepat. Keadaan tersebut berada dalam upvalue.
Pola Pengiterasi Fungsi Penutup
Kembalikan satu fungsi; keadaan disimpan dalam upvalue. For generik tidak menyediakan keadaan eksternal—for generik hanya memanggil fungsi tersebut setiap kali.
local function chars(s)
local i = 0
return function()
i = i + 1
local c = s:sub(i, i)
return c ~= "" and c or nil
end
end
for c in chars("lua") do print(c) endIterator Baris Berkas
Iterator penutup klasik yang menyimpan status menghasilkan baris dari penangan berkas hingga EOF.
local function lines(filename)
local f = io.open(filename, "r")
return function()
local line = f:read("*l")
if not line then f:close() end
return line
end
endIterator Penyaring
Bungkus iterator yang sudah ada dengan penutup yang melewati elemen yang tidak cocok dengan predikat.
local function filtered(iter, pred)
return function()
local v = iter()
while v ~= nil and not pred(v) do
v = iter()
end
return v
end
endIterator Pemetaan
Iterator pemetaan mengubah setiap elemen secara langsung tanpa membuat tabel perantara.
local function mapped(iter, fn)
return function()
local v = iter()
if v ~= nil then return fn(v) end
end
endIterator Penggabungan
Iterator penggabungan mengambil nilai dari dua iterator secara bersamaan dan berhenti ketika salah satunya habis.
local function zipped(iter1, iter2)
return function()
local a, b = iter1(), iter2()
if a ~= nil and b ~= nil then return a, b end
end
endIterator Berantai
Iterator rantai menghabiskan satu iterator terlebih dahulu sebelum beralih ke iterator berikutnya.
local function chained(...)
local iters = {...}
local idx = 1
return function()
while idx <= #iters do
local v = iters[idx]()
if v ~= nil then return v end
idx = idx + 1
end
end
endIterator Berjumlah
Batasi iterator hingga paling banyak N nilai menggunakan penghitung dalam penutup.
local function take(n, iter)
local count = 0
return function()
count = count + 1
if count <= n then return iter() end
end
endIterator Penelusuran Pohon
Penelusuran pohon secara mendalam menggunakan tumpukan (tabel sebagai nilai upvalue) untuk mempertahankan status penelusuran.
local function dfs(root)
local stack = {root}
return function()
if #stack == 0 then return nil end
local node = table.remove(stack)
for _, child in ipairs(node.children or {}) do
stack[#stack+1] = child
end
return node
end
endPertimbangan Memori
Iterator yang menyimpan status mengalokasikan objek penutup. Untuk perulangan dalam yang sangat ketat, iterator tanpa status mungkin lebih sesuai. Untuk penelusuran yang kompleks, penutup tersebut sangat sepadan.
Perbandingan: Dengan Status vs Tanpa Status
- Dengan status: status kompleks, urutan penelusuran apa pun, mudah ditulis.
- Tanpa status: akses berurutan sederhana, tanpa alokasi, cepat.
Pertanyaan tentang Iterator dengan Status
Di mana iterator penutup yang menyimpan status menyimpan statusnya?
Rangkuman: Iterator dengan Status
Iterator berbasis penutup yang menyimpan status menyimpan status penelusuran kompleks dalam upvalue, sehingga memungkinkan penyaringan, pemetaan, penelusuran pohon, dan pipeline malas—semuanya dapat dikomposisikan dan hemat memori.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Iterator Berkeadaan dengan Closure” gratis?
Ya — teks lengkap “Iterator Berkeadaan dengan Closure” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Iterator Berkeadaan dengan Closure”?
Bangun iterator yang mempertahankan keadaan antar-pemanggilan menggunakan closure. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Iterator Berkeadaan dengan Closure” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Protokol for Generik
- Iterator Tanpa Keadaan
- Iterator Berkeadaan dengan Closure
- Generator Berbasis Coroutine