ตัวสร้างลำดับด้วยโคโรทีน
ใช้ 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)) -- 15coroutine.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โพรโทคอล for แบบทั่วไป
- ตัววนซ้ำไร้สถานะ
- ตัววนซ้ำมีสถานะด้วยคลอเชอร์
- ตัวสร้างลำดับด้วยโคโรทีน