while 和 repeat-until 循环
使用 while 和 repeat-until 实现由条件驱动的迭代。
while 和 repeat-until 循环 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
while 循环
while 循环会在条件为真值时重复执行循环体。每次迭代之前都会检查条件。如果初始条件为假,循环体一次也不会执行。请始终确保循环在向退出条件推进,以避免无限循环。
local count = 1
while count <= 5 do
print(count)
count = count + 1
end
-- prints 1 through 5repeat-until 循环
repeat...until 循环相当于 Lua 中的 do-while 循环。循环体至少执行一次,并且在每次迭代之后检查条件。当条件变为真时,循环停止(与 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 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「while 和 repeat-until 循环」这节课中我会学到什么?
使用 while 和 repeat-until 实现由条件驱动的迭代。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「while 和 repeat-until 循环」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- if、elseif 和 else 语句
- while 和 repeat-until 循环
- 数值 for 循环
- 泛型 for 和 break