0Pricing
Lua Academy · Pelajaran

Generator Berbasis Coroutine

Gunakan coroutine.wrap untuk membuat urutan generator malas.

Generator Berbasis Coroutine adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Alasan Menggunakan Generator Coroutine

Penutup bekerja dengan baik untuk generator sederhana. Namun, jika logika pembangkitan memerlukan perulangan bersarang atau alur kontrol yang kompleks, generator coroutine jauh lebih rapi.

Dasar-dasar coroutine.wrap

coroutine.wrap(fn) mengembalikan sebuah fungsi. Setiap pemanggilan melanjutkan coroutine; nilai yang dihasilkan melalui coroutine.yield menjadi nilai yang dikembalikan.

local gen = coroutine.wrap(function()
  coroutine.yield(1)
  coroutine.yield(2)
  coroutine.yield(3)
end)
for v in gen do print(v) end

Generator Urutan Tak Terbatas

Coroutine dapat menghasilkan nilai tanpa batas, sehingga sangat cocok untuk urutan tak terbatas yang dihentikan oleh pemanggil dengan break.

local function naturals()
  return coroutine.wrap(function()
    local n = 0
    while true do
      n = n + 1
      coroutine.yield(n)
    end
  end)
end
for v in naturals() do
  if v > 5 then break end
  print(v)
end

Generator Penelusuran Pohon

Penelusuran mendalam secara rekursif menjadi mudah dengan coroutine—cukup hasilkan nilai dari pemanggilan rekursif tanpa mengelola tumpukan secara eksplisit.

local function walkTree(node)
  return coroutine.wrap(function()
    local function recurse(n)
      coroutine.yield(n.value)
      for _, child in ipairs(n.children or {}) do
        recurse(child)
      end
    end
    recurse(node)
  end)
end

Generator Fibonacci

Urutan Fibonacci secara alami dibuat sebagai coroutine: pertahankan dua variabel status dan hasilkan setiap suku.

local function fibs()
  return coroutine.wrap(function()
    local a, b = 0, 1
    while true do
      coroutine.yield(a)
      a, b = b, a + b
    end
  end)
end
local fib = fibs()
for i = 1, 8 do print(fib()) end

Mengirim Nilai ke Generator

Argumen untuk fungsi yang dilanjutkan menjadi nilai yang dikembalikan oleh yield, sehingga memungkinkan komunikasi dua arah.

local acc = coroutine.wrap(function()
  local total = 0
  while true do
    local n = coroutine.yield(total)
    total = total + (n or 0)
  end
end)
acc()  -- start
print(acc(10))  -- 10
print(acc(5))   -- 15

coroutine.wrap vs coroutine.create

wrap lebih sederhana dan melemparkan kesalahan. create mengembalikan objek thread dan memungkinkan Anda menangani kesalahan dari nilai yang dikembalikan resume.

Pipeline Generator

Rangkai generator berbasis coroutine untuk membuat pipeline malas: produsen menghasilkan data mentah, penyaring menghasilkan item yang cocok, dan pemeta menghasilkan item yang telah diubah.

Penerusan Kesalahan

Jika coroutine yang dibungkus melemparkan kesalahan, fungsi pembungkus juga akan melemparkannya. Bungkus pemanggilan generator dalam pcall agar dapat digunakan dengan aman.

Efisiensi Memori

Generator coroutine bersifat malas—generator menghitung nilai sesuai permintaan. Hal ini menghindari pembuatan tabel perantara yang besar, sebuah keuntungan utama untuk himpunan data berukuran besar.

Penanganan Kehabisan Nilai

Ketika fungsi coroutine selesai mengembalikan nilai (bukan menghasilkan nilai), pemanggilan berikutnya pada fungsi yang dibungkus mengembalikan nil, sehingga mengakhiri perulangan for generik secara alami.

Pertanyaan tentang Generator Coroutine

Apa yang terjadi ketika fungsi coroutine pada generator berbasis coroutine.wrap selesai mengembalikan nilai (bukan menghasilkan nilai)?

Rangkuman: Generator Coroutine

coroutine.wrap mengubah coroutine apa pun menjadi fungsi generator yang dapat digunakan kembali. Fitur ini memungkinkan urutan malas tak terbatas, penelusuran rekursif, dan tahap pipeline dengan alur kontrol yang rapi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Generator Berbasis Coroutine” gratis?

Ya — teks lengkap “Generator Berbasis Coroutine” 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 “Generator Berbasis Coroutine”?

Gunakan coroutine.wrap untuk membuat urutan generator malas. 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 4 dari 4.

Berapa lama pelajaran “Generator Berbasis Coroutine” 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