ตัววนซ้ำไร้สถานะ
เขียนตัววนซ้ำไร้สถานะ เช่น ipairs และสร้างรูปแบบกำหนดเอง
ตัววนซ้ำไร้สถานะ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตัววนซ้ำแบบไร้สถานะคืออะไร
ตัววนซ้ำแบบไร้สถานะจะไม่เก็บสถานะภายใน ข้อมูลทั้งหมดจะถูกส่งเป็นอาร์กิวเมนต์ในการเรียกแต่ละครั้ง ได้แก่ สถานะคงที่และตัวแปรควบคุมปัจจุบัน
ipairs: ตัวอย่างมาตรฐาน
ipairs เป็นแบบไร้สถานะ โดยใช้ตารางเป็นสถานะและใช้ดัชนีปัจจุบันเป็นตัวแปรควบคุม
local function myIpairs(t, i)
i = i + 1
local v = t[i]
if v ~= nil then return i, v end
end
-- Use: for i,v in myIpairs, t, 0 doตัววนซ้ำ squares
ตัววนซ้ำแบบไร้สถานะที่ส่งคืนกำลังสองต่อเนื่องกัน สถานะจะเก็บขีดจำกัด ส่วนตัวแปรควบคุมคือจำนวนปัจจุบัน
local function squaresIter(max, n)
n = n + 1
if n <= max then return n, n*n end
end
for n, sq in squaresIter, 5, 0 do
print(n, sq)
endไม่จำเป็นต้องใช้คลอเชอร์
ตัววนซ้ำแบบไร้สถานะไม่ต้องสร้างคลอเชอร์ เนื่องจากสถานะทั้งหมดถูกส่งเป็นอาร์กิวเมนต์ จึงไม่มีการจัดสรรหน่วยความจำบนฮีปในการวนแต่ละรอบ
การสร้างตัววนซ้ำรูปแบบ pairs
ตัววนซ้ำคีย์-ค่าแบบไร้สถานะที่ใช้ next เป็นฟังก์ชันตัววนซ้ำ ซึ่งเป็นวิธีเดียวกับที่ pairs ทำงาน
for k, v in next, {a=1, b=2} do
print(k, v)
endฟังก์ชัน next
next(t, k) ส่งคืนคู่คีย์-ค่าถัดจากคีย์ k ส่ง nil (หรือละเว้น) เพื่อเริ่มจากจุดเริ่มต้น
local t = {x=10, y=20}
local k, v = next(t, nil)
print(k, v)
k, v = next(t, k)
print(k, v)ตัววนซ้ำช่วงแบบกำหนดเอง
ตัววนซ้ำช่วงแบบไร้สถานะที่มีขั้น สถานะจะเก็บตารางการกำหนดค่า ส่วนตัวควบคุมคือค่าปัจจุบัน
local function rangeIter(state, n)
n = n + state.step
if n <= state.limit then return n end
end
for v in rangeIter, {limit=10, step=2}, 0 do
print(v)
endข้อได้เปรียบด้านประสิทธิภาพ
ตัววนซ้ำแบบไร้สถานะเหมาะอย่างยิ่งกับลูปที่ทำงานถี่ ๆ เพราะไม่สร้างคลอเชอร์ในการเรียกแต่ละครั้ง จึงเร็วกว่าตัววนซ้ำแบบคลอเชอร์ที่มีสถานะสำหรับการวนผ่านข้อมูลอย่างง่าย
ข้อจำกัด
เมื่อการวนซ้ำต้องใช้สถานะที่ซับซ้อน เช่น ตัวนับหลายตัว คิว หรือข้อมูลแบบไดนามิก ตัววนซ้ำแบบไร้สถานะจะใช้งานได้ไม่สะดวก ควรใช้ตัววนซ้ำแบบคลอเชอร์ที่มีสถานะหรือโครูทีนแทน
การใช้ร่วมกับ table.move
ตัววนซ้ำส่วนย่อยแบบไร้สถานะจะส่งคืนสมาชิกจากส่วนย่อยของตาราง สถานะคงที่จะเก็บอาร์เรย์และดัชนีสิ้นสุด ส่วนตัวควบคุมคือดัชนีปัจจุบัน
ตัววนซ้ำแบบไร้สถานะในไลบรารีมาตรฐาน
ipairs, pairs (ผ่าน next) และ string.gmatch ใช้รูปแบบไร้สถานะหรือเกือบไร้สถานะภายใน
คำถามเกี่ยวกับตัววนซ้ำแบบไร้สถานะ
อะไรทำให้ตัววนซ้ำเป็นแบบไร้สถานะ
สรุป: ตัววนซ้ำแบบไร้สถานะ
ตัววนซ้ำแบบไร้สถานะรับบริบททั้งหมดเป็นอาร์กิวเมนต์ ไม่ต้องจัดสรรคลอเชอร์ และมีประสิทธิภาพสูง เหมาะอย่างยิ่งกับการวนผ่านข้อมูลตามลำดับอย่างง่าย เช่น การเข้าถึงดัชนีของอาร์เรย์
คำถามที่พบบ่อย
บทเรียน “ตัววนซ้ำไร้สถานะ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัววนซ้ำไร้สถานะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัววนซ้ำไร้สถานะ”
เขียนตัววนซ้ำไร้สถานะ เช่น ipairs และสร้างรูปแบบกำหนดเอง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัววนซ้ำไร้สถานะ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ