0Pricing
Lua Academy · บทเรียน

ตัวสร้างลำดับด้วยโคโรทีน

ใช้ coroutine.wrap เพื่อสร้างลำดับค่าที่ประเมินเมื่อจำเป็น

ตัวสร้างลำดับด้วยโคโรทีน เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุผลที่ใช้ตัวสร้างจากโครูทีน

โคลสเชอร์ทำงานได้ดีสำหรับตัวสร้างแบบง่าย แต่หากตรรกะการสร้างต้องใช้ลูปซ้อนกันหรือการควบคุมการทำงานที่ซับซ้อน ตัวสร้างจากโครูทีนจะเขียนได้สะอาดกว่ามาก

พื้นฐาน coroutine.wrap

coroutine.wrap(fn) จะส่งคืนฟังก์ชัน การเรียกแต่ละครั้งจะทำให้โครูทีนทำงานต่อ และค่าที่ส่งผ่าน coroutine.yield จะกลายเป็นค่าที่ส่งคืน

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

ตัวสร้างลำดับอนันต์

โครูทีนสามารถส่งค่าออกไปได้ไม่สิ้นสุด จึงเหมาะอย่างยิ่งสำหรับลำดับอนันต์ที่ผู้เรียกยุติด้วย 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

ตัวสร้างสำหรับเดินต้นไม้

การเดินสำรวจต้นไม้เชิงลึกแบบเรียกซ้ำทำได้ง่ายด้วยโครูทีน เพียงส่งค่าจากการเรียกซ้ำโดยไม่ต้องจัดการกองซ้อนอย่างชัดเจน

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

ตัวสร้างลำดับฟีโบนักชี

ลำดับฟีโบนักชีเหมาะกับการสร้างด้วยโครูทีน เพียงเก็บตัวแปรสถานะสองตัวและส่งคืนแต่ละพจน์

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

การส่งค่าเข้าไปยังตัวสร้าง

อาร์กิวเมนต์ของฟังก์ชันที่ทำงานต่อคือค่าที่ส่งคืนโดย yield ทำให้สื่อสารได้สองทาง

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 กับ coroutine.create

wrap ใช้ง่ายกว่าและจะแจ้งข้อผิดพลาดออกมา ส่วน create จะส่งคืนออบเจ็กต์เธรดและเปิดให้คุณจัดการข้อผิดพลาดจากค่าที่ resume ส่งคืน

ไปป์ไลน์ของตัวสร้าง

เชื่อมตัวสร้างที่ทำงานด้วยโครูทีนเพื่อสร้างไปป์ไลน์แบบประเมินเมื่อจำเป็น: ผู้ผลิตจะส่งข้อมูลดิบ ตัวกรองจะส่งสมาชิกที่ตรงเงื่อนไข และตัวแมปจะส่งสมาชิกที่แปลงแล้ว

การส่งต่อข้อผิดพลาด

หากโครูทีนที่ถูกห่อเกิดข้อผิดพลาด ฟังก์ชันห่อก็จะเกิดข้อผิดพลาดเช่นกัน ให้ห่อการเรียกตัวสร้างด้วย pcall เพื่อใช้งานอย่างปลอดภัย

ประสิทธิภาพด้านหน่วยความจำ

ตัวสร้างจากโครูทีนทำงานแบบประเมินเมื่อจำเป็น คือคำนวณค่าเมื่อมีการร้องขอเท่านั้น จึงหลีกเลี่ยงการสร้างตารางชั่วคราวขนาดใหญ่ ซึ่งเป็นข้อได้เปรียบสำคัญสำหรับชุดข้อมูลขนาดใหญ่

การจัดการเมื่อข้อมูลหมด

เมื่อฟังก์ชันโครูทีนส่งคืนค่า (ไม่ใช่การส่งค่าด้วย yield) การเรียกฟังก์ชันที่ถูกห่อครั้งถัดไปจะส่งคืน nil ทำให้ลูป for ทั่วไปสิ้นสุดลงโดยอัตโนมัติ

คำถามเกี่ยวกับตัวสร้างจากโครูทีน

จะเกิดอะไรขึ้นเมื่อฟังก์ชันโครูทีนของตัวสร้างที่ใช้ coroutine.wrap ส่งคืนค่า (ไม่ใช่การส่งค่าด้วย yield)

สรุป: ตัวสร้างจากโครูทีน

coroutine.wrap เปลี่ยนโครูทีนใด ๆ ให้เป็นฟังก์ชันตัวสร้างที่นำกลับมาใช้ซ้ำได้ ช่วยให้สร้างลำดับอนันต์แบบประเมินเมื่อจำเป็น การเดินสำรวจแบบเรียกซ้ำ และขั้นตอนของไปป์ไลน์ได้ด้วยการควบคุมการทำงานที่กระชับ

คำถามที่พบบ่อย

บทเรียน “ตัวสร้างลำดับด้วยโคโรทีน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวสร้างลำดับด้วยโคโรทีน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวสร้างลำดับด้วยโคโรทีน”

ใช้ coroutine.wrap เพื่อสร้างลำดับค่าที่ประเมินเมื่อจำเป็น คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวสร้างลำดับด้วยโคโรทีน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โพรโทคอล for แบบทั่วไป
  2. ตัววนซ้ำไร้สถานะ
  3. ตัววนซ้ำมีสถานะด้วยคลอเชอร์
  4. ตัวสร้างลำดับด้วยโคโรทีน
← กลับไปที่ Lua Academy