Lua Academy · บทเรียน

ตัววนซ้ำมีสถานะด้วยคลอเชอร์

สร้างตัววนซ้ำที่รักษาสถานะระหว่างการเรียกใช้ด้วยคลอเชอร์

บทเรียน 3 จาก 413 ขั้นตอน

ตัววนซ้ำมีสถานะด้วยคลอเชอร์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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