ตัววนซ้ำมีสถานะด้วยคลอเชอร์
สร้างตัววนซ้ำที่รักษาสถานะระหว่างการเรียกใช้ด้วยคลอเชอร์
ตัววนซ้ำมีสถานะด้วยคลอเชอร์ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
กรณีที่คลอเชอร์มีประโยชน์
เมื่อตัววนซ้ำต้องรักษาสถานะที่ซับซ้อนและเปลี่ยนแปลงไปเรื่อย ๆ เช่น ตำแหน่ง สแตก หรือประวัติ คลอเชอร์คือเครื่องมือที่เหมาะสมตามธรรมชาติ สถานะจะอยู่ในอัปแวลู
รูปแบบตัววนซ้ำด้วยคลอเชอร์
ส่งคืนฟังก์ชันเพียงตัวเดียว โดยเก็บสถานะไว้ในอัปแวลู for แบบทั่วไปจะไม่ส่งสถานะภายนอกมาให้ แต่จะเรียกฟังก์ชันในแต่ละครั้งเท่านั้น
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ตัววนซ้ำบรรทัดของไฟล์
ตัววนซ้ำแบบโคลสเชอร์ที่เก็บสถานะตามแบบดั้งเดิมจะส่งคืนบรรทัดจากตัวจัดการไฟล์จนกว่าจะถึง 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ตัววนซ้ำแบบกรอง
ห่อตัววนซ้ำที่มีอยู่ด้วยโคลสเชอร์ซึ่งข้ามสมาชิกที่ไม่ตรงกับเพรดิเคต
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ตัววนซ้ำแบบแมป
ตัววนซ้ำแบบแมปจะแปลงสมาชิกแต่ละตัวทันที โดยไม่ต้องสร้างตารางชั่วคราว
local function mapped(iter, fn)
return function()
local v = iter()
if v ~= nil then return fn(v) end
end
endตัววนซ้ำแบบซิป
ตัววนซ้ำแบบซิปจะดึงข้อมูลจากตัววนซ้ำสองตัวพร้อมกัน และหยุดเมื่อ ตัวใดตัวหนึ่งหมดสมาชิก
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ตัววนซ้ำแบบเชื่อมต่อ
ตัววนซ้ำแบบเชื่อมต่อจะใช้ตัววนซ้ำตัวหนึ่งจนหมดก่อนสลับไปยังตัวถัดไป
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ตัววนซ้ำแบบนับจำนวน
จำกัดตัววนซ้ำให้ส่งคืนค่าไม่เกิน N ค่า โดยใช้ตัวนับในโคลสเชอร์
local function take(n, iter)
local count = 0
return function()
count = count + 1
if count <= n then return iter() end
end
endตัววนซ้ำสำหรับเดินต้นไม้
การเดินต้นไม้แบบค้นหาก่อนเชิงลึกจะใช้กองซ้อน (ตารางในอัปแวลู) เพื่อรักษาสถานะการเดินสำรวจ
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ข้อพิจารณาด้านหน่วยความจำ
ตัววนซ้ำที่เก็บสถานะจะจัดสรรออบเจ็กต์โคลสเชอร์ สำหรับลูปด้านในที่ต้องทำงานถี่มาก ตัววนซ้ำที่ไม่เก็บสถานะอาจเหมาะกว่า แต่สำหรับการเดินสำรวจที่ซับซ้อน โคลสเชอร์ก็คุ้มค่าอย่างยิ่ง
เปรียบเทียบ: แบบเก็บสถานะกับแบบไม่เก็บสถานะ
- แบบเก็บสถานะ: จัดการสถานะที่ซับซ้อนได้ รองรับลำดับการเดินสำรวจใด ๆ และเขียนได้ง่าย
- แบบไม่เก็บสถานะ: เข้าถึงข้อมูลตามลำดับอย่างง่าย ไม่ต้องจัดสรรหน่วยความจำ และทำงานได้รวดเร็ว
คำถามเกี่ยวกับตัววนซ้ำที่เก็บสถานะ
ตัววนซ้ำแบบโคลสเชอร์ที่เก็บสถานะจัดเก็บสถานะไว้ที่ใด
สรุป: ตัววนซ้ำที่เก็บสถานะ
ตัววนซ้ำที่เก็บสถานะโดยใช้โคลสเชอร์จะเก็บสถานะการเดินสำรวจที่ซับซ้อนไว้ในอัปแวลู ทำให้รองรับตัวกรอง การแมป ต้นไม้ และไปป์ไลน์แบบประเมินเมื่อจำเป็นได้ โดยทั้งหมดสามารถประกอบใช้งานร่วมกันและประหยัดหน่วยความจำ
เรียนรู้ Lua ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 40
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “ตัววนซ้ำมีสถานะด้วยคลอเชอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัววนซ้ำมีสถานะด้วยคลอเชอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัววนซ้ำมีสถานะด้วยคลอเชอร์”
สร้างตัววนซ้ำที่รักษาสถานะระหว่างการเรียกใช้ด้วยคลอเชอร์ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัววนซ้ำมีสถานะด้วยคลอเชอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โพรโทคอล for แบบทั่วไป
- ตัววนซ้ำไร้สถานะ
- ตัววนซ้ำมีสถานะด้วยคลอเชอร์
- ตัวสร้างลำดับด้วยโคโรทีน