Lua Academy · Pelajaran

Penjana Berasaskan Coroutine

Gunakan coroutine.wrap untuk mencipta jujukan penjana malas.

Pelajaran 4 daripada 413 langkah

Penjana Berasaskan Coroutine ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Sebab Menggunakan Penjana Coroutine

Penutupan berfungsi dengan baik untuk penjana mudah. Namun, jika logik penjanaan memerlukan gelung bersarang atau aliran kawalan yang kompleks, penjana coroutine jauh lebih kemas.

Asas coroutine.wrap

coroutine.wrap(fn) mengembalikan satu fungsi. Setiap panggilan menyambung semula coroutine; nilai yang dihasilkan melalui coroutine.yield menjadi nilai pulangan.

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

Penjana Jujukan Tidak Terhingga

Coroutine boleh menghasilkan nilai tanpa henti, menjadikannya sesuai untuk jujukan tidak terhingga 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

Penjana Perjalanan Pepohon

Perjalanan mendalam secara rekursif amat mudah dengan coroutine — hasilkan nilai sahaja daripada panggilan rekursif tanpa mengurus tindanan secara nyata.

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

Penjana Fibonacci

Jujukan Fibonacci semula jadi digunakan sebagai coroutine: kekalkan dua pemboleh ubah keadaan dan hasilkan setiap sebutan.

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

Menghantar Nilai ke dalam Penjana

Argumen kepada fungsi yang disambung semula ialah nilai pulangan yield, yang membolehkan komunikasi dua hala.

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 berbanding coroutine.create

wrap lebih mudah dan mencetuskan ralat. create mengembalikan objek utas dan membolehkan anda mengendalikan ralat daripada nilai pulangan resume.

Saluran Penjana

Rantaikan penjana berasaskan coroutine untuk saluran malas: pengeluar menghasilkan data mentah, penapis menghasilkan item yang sepadan, dan pemeta menghasilkan item yang diubah.

Penyebaran Ralat

Jika coroutine yang dibungkus mencetuskan ralat, fungsi pembungkus itu juga mencetuskan ralat. Bungkus panggilan penjana dalam pcall untuk penggunaan yang selamat.

Kecekapan Memori

Penjana coroutine bersifat malas — nilainya dikira apabila diperlukan. Ini mengelakkan pembinaan jadual perantaraan yang besar, suatu kelebihan utama bagi set data besar.

Pengendalian Kehabisan

Apabila fungsi coroutine selesai dengan pulangan (bukan menghasilkan nilai), panggilan seterusnya kepada fungsi yang dibungkus mengembalikan nil, lalu menamatkan gelung for generik secara semula jadi.

Soalan Penjana Coroutine

Apakah yang berlaku apabila fungsi coroutine bagi penjana berasaskan coroutine.wrap selesai dengan pulangan (bukan menghasilkan nilai)?

Imbas Kembali: Penjana Coroutine

coroutine.wrap menukar sebarang coroutine menjadi fungsi penjana yang boleh digunakan semula. Ia membolehkan jujukan tidak terhingga malas, perjalanan rekursif dan peringkat saluran dengan aliran kawalan yang kemas.

Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Penjana Berasaskan Coroutine” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Penjana Berasaskan Coroutine”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Penjana Berasaskan Coroutine”?

Gunakan coroutine.wrap untuk mencipta jujukan penjana malas. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Penjana Berasaskan Coroutine” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Protokol for Generik
  2. Lelaran Tanpa Keadaan
  3. Lelaran Berkeadaan dengan Closure
  4. Penjana Berasaskan Coroutine
← Kembali ke Lua Academy