0Pricing
Lua Academy · Pelajaran

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) end

Iterator 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
end

Iterator 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
end

Iterator 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
end

Iterator 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
end

Iterator 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
end

Iterator 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
end

Iterator 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
end

Pertimbangan 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

  1. Protokol for Generik
  2. Iterator Tanpa Keadaan
  3. Iterator Berkeadaan dengan Closure
  4. Generator Berbasis Coroutine
← Kembali ke Lua Academy