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

ลูป while และ repeat-until

ใช้ while และ repeat-until เพื่อทำซ้ำตามเงื่อนไข

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

ลูป while

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

local count = 1

while count <= 5 do
  print(count)
  count = count + 1
end
-- prints 1 through 5

ลูป repeat-until

ลูป repeat...until เป็นรูปแบบเทียบเท่ากับ do-while ของ Lua ส่วนเนื้อหาลูปจะทำงาน อย่างน้อยหนึ่งครั้ง และจะตรวจสอบเงื่อนไข หลังจากการทำงานแต่ละรอบ ลูปจะหยุดเมื่อเงื่อนไขเป็นจริง (ตรงข้ามกับ while) ตัวแปรที่ประกาศภายในส่วนเนื้อหาลูปจะมองเห็นได้ในเงื่อนไข

local n = 1

repeat
  print(n)
  n = n * 2
until n > 100
-- prints: 1, 2, 4, 8, 16, 32, 64

ลูปไม่สิ้นสุดด้วย break

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

local attempts = 0
local MAX = 3

while true do
  attempts = attempts + 1
  print("Attempt " .. attempts)
  if attempts >= MAX then
    print("Max attempts reached")
    break
  end
end

นับถอยหลังด้วย while

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

local i = 10

while i > 0 do
  io.write(i .. " ")
  i = i - 1
end
print()   -- newline
-- output: 10 9 8 7 6 5 4 3 2 1

repeat-until สำหรับตรวจสอบข้อมูลนำเข้า

รูปแบบ repeat-until เหมาะอย่างยิ่งสำหรับการตรวจสอบข้อมูลนำเข้า โดยรับข้อมูลหนึ่งครั้งแล้วจึงตรวจสอบภายหลัง ในรูปแบบนี้ส่วนเนื้อหาลูปจะทำงานอย่างน้อยหนึ่งครั้งเสมอ ซึ่งสอดคล้องกับลำดับตามธรรมชาติของการ "ถาม แล้วตรวจสอบ"

-- Simulated input validation
local inputs = {-1, 0, 5}  -- pretend user input
local idx = 0
local value

repeat
  idx = idx + 1
  value = inputs[idx]
  print("Got: " .. value)
until value > 0

print("Valid value: " .. value)  -- 5

ตัวแปรของลูปเป็นตัวแปรเฉพาะที่

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

local callbacks = {}

for i = 1, 3 do
  local captured = i        -- local per iteration
  callbacks[i] = function() return captured end
end

print(callbacks[1]())  -- 1
print(callbacks[2]())  -- 2
print(callbacks[3]())  -- 3

รูปแบบตัวสะสม

กรณีใช้งานทั่วไปของลูป while คือการสะสมผลลัพธ์ การหาผลรวม ผลคูณ การต่อสตริง และการสร้างตาราง ล้วนใช้รูปแบบตัวสะสมเหมือนกัน ได้แก่ กำหนดค่าเริ่มต้นก่อนลูป อัปเดตค่าภายในลูป แล้วใช้ผลลัพธ์หลังลูป

local numbers = {3, 1, 4, 1, 5, 9, 2, 6}
local sum = 0
local i = 1

while i <= #numbers do
  sum = sum + numbers[i]
  i = i + 1
end

print("Sum:", sum)     -- 31
print("Avg:", sum / #numbers)  -- 3.875

ลูปซ้อนกัน

สามารถซ้อนลูปไว้ภายในกันได้ แต่ละลูปจะมีตัวนับของตนเอง ควรใช้ชื่อตัวแปรที่สื่อความหมายเพื่อให้โค้ดอ่านง่าย คำสั่ง break จะออกจากลูปที่ครอบอยู่ ชั้นในสุดเท่านั้น หากต้องการออกจากหลายระดับ อาจต้องใช้ตัวแปรธงหรือ goto (Lua 5.2 ขึ้นไป)

local found = false
local target = 6

local i = 1
while i <= 3 and not found do
  local j = 1
  while j <= 3 do
    if i * j == target then
      print(i .. " * " .. j .. " = " .. target)
      found = true
      break
    end
    j = j + 1
  end
  i = i + 1
end

goto สำหรับการออกจากลูปหลายระดับ

Lua 5.2 ขึ้นไปเพิ่ม goto สำหรับกระโดดไปยังตำแหน่งที่มีป้ายกำกับ แม้โดยทั่วไปจะไม่แนะนำให้ใช้ แต่ก็เหมาะสมสำหรับการออกจากลูปซ้อนกันอย่างสะอาดโดยไม่ต้องใช้ตัวแปรธง ป้ายกำกับกำหนดด้วย ::name::

for i = 1, 5 do
  for j = 1, 5 do
  -- goto only valid approach for nested break in Lua
    if i * j > 10 then
      goto done
    end
    io.write(i*j .. " ")
  end
end
::done::
print()
print("Stopped early")

ข้อแลกเปลี่ยนระหว่าง while กับ repeat

while: ใช้เมื่ออาจต้องการให้ลูปทำงานศูนย์รอบ เพราะจะตรวจสอบเงื่อนไขก่อน repeat-until: ใช้เมื่อต้องการให้ลูปทำงานอย่างน้อยหนึ่งรอบ โดยตรวจสอบภายหลัง โดยทั่วไปควรเลือกใช้ while สำหรับลูปส่วนใหญ่ และใช้ repeat-until กับเมนู ข้อความแจ้ง และลูปลองใหม่ที่ต้องทำงานก่อนตรวจสอบ

-- while: may execute zero times
local ready = false
while ready do
  print("never prints")
end

-- repeat-until: always executes at least once
local done = false
repeat
  print("runs once even though done=false")
  done = true
until done

ตรวจสอบความเข้าใจ

เงื่อนไขในลูป repeat...until จะถูกตรวจสอบเมื่อใด

สรุป: while และ repeat-until

ประเด็นสำคัญ:

  • while cond do ... end — ตรวจสอบก่อน อาจไม่ทำงานเลย
  • repeat ... until cond — ตรวจสอบภายหลัง ทำงานอย่างน้อยหนึ่งครั้ง
  • break ออกจากลูปชั้นในสุด
  • goto ::label:: สามารถออกจากลูปซ้อนกันได้ (Lua 5.2 ขึ้นไป)
  • ตัวแปรเฉพาะที่ของลูปจะถูกสร้างใหม่ในแต่ละรอบ
  • ใช้รูปแบบตัวสะสมเพื่อสร้างผลลัพธ์

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

บทเรียน “ลูป while และ repeat-until” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ลูป while และ repeat-until”

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

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

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

บทเรียน “ลูป while และ repeat-until” ใช้เวลานานแค่ไหน

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

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

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

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

  1. คำสั่ง if, elseif และ else
  2. ลูป while และ repeat-until
  3. ลูป for เชิงตัวเลข
  4. for แบบทั่วไปและ break
← กลับไปที่ Lua Academy