Lua 循环
关键要点
- 研究表明,Lua 提供四种循环结构:
while
、repeat-until
、数值型for
和泛型for
,用于重复执行代码块。 - 证据显示,
while
和repeat-until
适合条件控制循环,for
适合固定次数或遍历表,break
和goto
可控制循环流程。 - 看起来很可能是
ipairs
用于遍历表的数组部分,pairs
用于遍历所有键值对,循环中推荐使用local
变量优化性能。
Lua 循环简介
概述
Lua 的循环结构用于重复执行代码块,支持多种场景,如计数循环、条件循环和表遍历。Lua 提供 while
、repeat-until
、for
(数值型和泛型)四种循环,结合 break
和 goto
控制流程。本文详细讲解 Lua 循环的语法、用法、示例及注意事项,适合初学者快速上手。
循环类型
- while 循环:条件为真时重复执行。
- repeat-until 循环:至少执行一次,直到条件为真。
- 数值型 for 循环:按固定步长迭代指定范围。
- 泛型 for 循环:遍历表或迭代器,支持
ipairs
和pairs
。 - 流程控制:
break
终止循环,goto
跳转到标签。
参考资源
详细调研报告
本文为用户提供关于 Lua 循环的全面中文讲解,涵盖 while
、repeat-until
、for
循环、流程控制、表遍历及示例,基于可靠的在线资源和官方文档。
Lua 循环概述
Lua 的循环结构简单灵活,支持条件循环和迭代循环,适用于计数、条件判断和数据结构遍历。研究表明,Lua 的循环通过 while
、repeat-until
和 for
实现,ipairs
和 pairs
是表遍历的核心工具。以下是详细分析:
- while 循环:
- 语法:
lua while 条件 do -- 代码块 end
- 说明:当条件为真时,重复执行代码块;条件为假(
nil
或false
)时退出。 - 示例:
lua local i = 1 while i <= 3 do print("第 " .. i .. " 次循环") i = i + 1 end
输出:第 1 次循环 第 2 次循环 第 3 次循环
- 注意:确保条件最终为假,避免无限循环;推荐使用
local
变量。 - repeat-until 循环:
- 语法:
lua repeat -- 代码块 until 条件
- 说明:至少执行一次代码块,直到条件为真时退出(与
while
相反)。 - 示例:
lua local i = 1 repeat print("第 " .. i .. " 次循环") i = i + 1 until i > 3
输出:第 1 次循环 第 2 次循环 第 3 次循环
- 注意:
until
条件为真时停止,代码块至少执行一次。 - 数值型 for 循环:
- 语法:
lua for 变量 = 初值, 终值, 步长 do -- 代码块 end
- 说明:
- 从
初值
到终值
,每次递增步长
(默认为 1)。 步长
可为负数,表示递减。
- 从
- 示例:
lua -- 递增 for i = 1, 5, 2 do print("值: " .. i) end
输出:值: 1 值: 3 值: 5
lua -- 递减 for i = 5, 1, -1 do print("值: " .. i) end
输出:值: 5 值: 4 值: 3 值: 2 值: 1
- 注意:循环变量自动为局部变量,仅在循环体内有效。
- 泛型 for 循环:
- 语法:
lua for 变量列表 in 迭代器 do -- 代码块 end
- 说明:用于遍历迭代器返回的值,常用于表遍历,配合
ipairs
(数组部分)或pairs
(所有键值对)。 - 示例(ipairs):
lua local arr = {"apple", "banana", "orange"} for i, v in ipairs(arr) do print("索引: " .. i .. ", 值: " .. v) end
输出:索引: 1, 值: apple 索引: 2, 值: banana 索引: 3, 值: orange
- 示例(pairs):
lua local dict = {name = "Alice", age = 25, city = "Beijing"} for k, v in pairs(dict) do print("键: " .. k .. ", 值: " .. v) end
输出(键顺序可能不同):键: name, 值: Alice 键: age, 值: 25 键: city, 值: Beijing
- 注意:
ipairs
遍历连续整数索引(从 1 开始),遇到nil
停止。pairs
遍历所有键值对,顺序不定。- 自定义迭代器可通过函数实现。
- 流程控制:
- break:立即退出当前循环(仅支持
while
、repeat
和for
)。lua for i = 1, 5 do if i == 3 then break end print(i) end
输出:1 2
- goto(Lua 5.2+):跳转到指定标签,需谨慎使用。
lua local i = 1 while i <= 5 do if i == 3 then goto skip end print(i) i = i + 1 end ::skip:: print("跳到此处")
输出:1 2 跳到此处
- 注意:
goto
可能降低代码可读性,仅在复杂控制流中使用。 - 嵌套循环:
- 循环可嵌套,支持多层循环处理复杂逻辑。
- 示例:
lua for i = 1, 2 do for j = 1, 2 do print("i: " .. i .. ", j: " .. j) end end
输出:i: 1, j: 1 i: 1, j: 2 i: 2, j: 1 i: 2, j: 2
实际应用示例
以下是一个综合示例,展示多种循环处理学生成绩:
-- 示例:学生成绩统计
local students = {
{name = "Alice", score = 85},
{name = "Bob", score = 92},
{name = "Charlie", score = 78}
}
-- while 循环:打印成绩
local i = 1
while i <= #students do
print("while: " .. students[i].name .. " 成绩: " .. students[i].score)
i = i + 1
end
-- repeat-until 循环:统计优秀学生(成绩 >= 80)
local count = 0
local j = 1
repeat
if students[j].score >= 80 then
count = count + 1
end
j = j + 1
until j > #students
print("优秀学生人数: " .. count)
-- 数值型 for 循环:打印编号
for k = 1, #students do
print("for: 学生 " .. k .. ": " .. students[k].name)
end
-- 泛型 for 循环:遍历学生信息
for _, student in ipairs(students) do
print("ipairs: " .. student.name .. ", 成绩: " .. student.score)
if student.score < 80 then
break -- 遇到成绩低于 80 退出
end
end
-- 示例:学生成绩统计
local students = {
{name = "Alice", score = 85},
{name = "Bob", score = 92},
{name = "Charlie", score = 78}
}
-- while 循环:打印成绩
local i = 1
while i <= #students do
print("while: " .. students[i].name .. " 成绩: " .. students[i].score)
i = i + 1
end
-- repeat-until 循环:统计优秀学生(成绩 >= 80)
local count = 0
local j = 1
repeat
if students[j].score >= 80 then
count = count + 1
end
j = j + 1
until j > #students
print("优秀学生人数: " .. count)
-- 数值型 for 循环:打印编号
for k = 1, #students do
print("for: 学生 " .. k .. ": " .. students[k].name)
end
-- 泛型 for 循环:遍历学生信息
for _, student in ipairs(students) do
print("ipairs: " .. student.name .. ", 成绩: " .. student.score)
if student.score < 80 then
break -- 遇到成绩低于 80 退出
end
end
输出:
while: Alice 成绩: 85
while: Bob 成绩: 92
while: Charlie 成绩: 78
优秀学生人数: 2
for: 学生 1: Alice
for: 学生 2: Bob
for: 学生 3: Charlie
ipairs: Alice, 成绩: 85
ipairs: Bob, 成绩: 92
注意事项
- 无限循环:确保
while
和repeat-until
的条件最终为假或真,避免无限循环。 - 表遍历:
ipairs
适合连续整数索引,pairs
适合非连续或键值对;注意索引从 1 开始。 - 局部变量:循环变量(如
for i = 1, 5
中的i
)自动为局部变量,推荐在循环体中使用local
。 - break 限制:
break
只能退出当前循环,无法跳出多层循环(可用goto
实现)。 - 编码:中文字符串需保存为 UTF-8 编码,避免乱码。
推荐资源
- 菜鸟教程 – Lua 循环:提供简单循环示例。
- Lua 官方手册:权威控制结构参考。
- LuaScripts – Lua Tutorials:实用教程和示例。
这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。
结论
Lua 的循环结构(while
、repeat-until
、for
)简单高效,适用于条件控制和表遍历。推荐使用 local
变量优化性能,结合 ipairs
和 pairs
处理表数据。用户可通过示例练习掌握循环用法,结合 IDE(如 ZeroBrane Studio)提高开发效率。
表格总结
循环类型 | 语法 | 用途 | 示例 |
---|---|---|---|
while | while 条件 do ... end | 条件循环 | while i <= 3 do print(i) i = i + 1 end |
repeat-until | repeat ... until 条件 | 至少执行一次 | repeat print(i) i = i + 1 until i > 3 |
数值型 for | for i = 初值, 终值, 步长 do ... end | 固定次数循环 | for i = 1, 5 do print(i) end |
泛型 for | for 变量 in 迭代器 do ... end | 遍历表或迭代器 | for k, v in pairs(t) do print(k, v) end |
break | break | 退出循环 | if i == 3 then break end |
goto | goto 标签 ::标签:: | 跳转控制 | if i == 3 then goto skip end |