Lua 循环

关键要点

  • 研究表明,Lua 提供四种循环结构:whilerepeat-until、数值型 for 和泛型 for,用于重复执行代码块。
  • 证据显示,whilerepeat-until 适合条件控制循环,for 适合固定次数或遍历表,breakgoto 可控制循环流程。
  • 看起来很可能是 ipairs 用于遍历表的数组部分,pairs 用于遍历所有键值对,循环中推荐使用 local 变量优化性能。

Lua 循环简介

概述

Lua 的循环结构用于重复执行代码块,支持多种场景,如计数循环、条件循环和表遍历。Lua 提供 whilerepeat-untilfor(数值型和泛型)四种循环,结合 breakgoto 控制流程。本文详细讲解 Lua 循环的语法、用法、示例及注意事项,适合初学者快速上手。

循环类型

  • while 循环:条件为真时重复执行。
  • repeat-until 循环:至少执行一次,直到条件为真。
  • 数值型 for 循环:按固定步长迭代指定范围。
  • 泛型 for 循环:遍历表或迭代器,支持 ipairspairs
  • 流程控制break 终止循环,goto 跳转到标签。

参考资源


详细调研报告

本文为用户提供关于 Lua 循环的全面中文讲解,涵盖 whilerepeat-untilfor 循环、流程控制、表遍历及示例,基于可靠的在线资源和官方文档。

Lua 循环概述

Lua 的循环结构简单灵活,支持条件循环和迭代循环,适用于计数、条件判断和数据结构遍历。研究表明,Lua 的循环通过 whilerepeat-untilfor 实现,ipairspairs 是表遍历的核心工具。以下是详细分析:

  • while 循环
  • 语法
    lua while 条件 do -- 代码块 end
  • 说明:当条件为真时,重复执行代码块;条件为假(nilfalse)时退出。
  • 示例
    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:立即退出当前循环(仅支持 whilerepeatfor)。
    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

注意事项

  • 无限循环:确保 whilerepeat-until 的条件最终为假或真,避免无限循环。
  • 表遍历ipairs 适合连续整数索引,pairs 适合非连续或键值对;注意索引从 1 开始。
  • 局部变量:循环变量(如 for i = 1, 5 中的 i)自动为局部变量,推荐在循环体中使用 local
  • break 限制break 只能退出当前循环,无法跳出多层循环(可用 goto 实现)。
  • 编码:中文字符串需保存为 UTF-8 编码,避免乱码。

推荐资源

这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。

结论

Lua 的循环结构(whilerepeat-untilfor)简单高效,适用于条件控制和表遍历。推荐使用 local 变量优化性能,结合 ipairspairs 处理表数据。用户可通过示例练习掌握循环用法,结合 IDE(如 ZeroBrane Studio)提高开发效率。

表格总结

循环类型语法用途示例
whilewhile 条件 do ... end条件循环while i <= 3 do print(i) i = i + 1 end
repeat-untilrepeat ... until 条件至少执行一次repeat print(i) i = i + 1 until i > 3
数值型 forfor i = 初值, 终值, 步长 do ... end固定次数循环for i = 1, 5 do print(i) end
泛型 forfor 变量 in 迭代器 do ... end遍历表或迭代器for k, v in pairs(t) do print(k, v) end
breakbreak退出循环if i == 3 then break end
gotogoto 标签 ::标签::跳转控制if i == 3 then goto skip end

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注