Lua 流程控制(实战指南)

Lua 流程控制入门:让程序“听话”地跑起来

在编程的世界里,代码就像一条条指令,而流程控制就是让这些指令按照你想要的方式执行的“指挥棒”。如果你把程序比作一条公路,那么流程控制就是红绿灯、岔路口和限速标志——没有它们,车辆(代码)就会乱成一团。Lua 语言虽然轻量,但它的流程控制机制非常清晰且强大,适合初学者快速上手,也足以支撑中高级项目中的逻辑处理。

本文将带你一步步掌握 Lua 流程控制的核心语法,从最基础的判断到循环结构,再到复杂场景下的灵活运用。全程结合真实代码示例,手把手带你构建逻辑思维,让你写的代码不再“死板”,而是真正“会思考”。


条件判断:if-else 让程序学会“选择”

在现实生活中,我们每天都在做选择:下雨就带伞,没带伞就淋雨。程序也一样,它需要根据条件来决定下一步做什么。Lua 中最核心的条件控制结构就是 if 语句。

-- 示例:判断用户是否成年
local age = 18

if age >= 18 then
    print("恭喜!你已经成年,可以办理身份证了。")
else
    print("你还未成年,需要监护人陪同办理相关业务。")
end

注释:

  • if age >= 18 then 表示如果 age 大于等于 18,就执行 then 后面的代码块。
  • else 是“否则”的意思,当 if 条件不成立时,执行这里的内容。
  • end 是所有控制结构的结束标志,不可省略。

更复杂的判断可以使用 elseif 来实现多条件分支:

-- 示例:根据成绩评定等级
local score = 85

if score >= 90 then
    print("优秀")
elseif score >= 80 then
    print("良好")
elseif score >= 70 then
    print("中等")
elseif score >= 60 then
    print("及格")
else
    print("不及格,需要补考")
end

注释:

  • elseif 是“else if”的缩写,用于添加多个判断条件。
  • 条件从上往下依次判断,一旦命中就跳出,后续不再检查。
  • 这种结构非常像“菜单式选择”,每一步都像在问:“你选哪个?”

三元运算符:简洁的条件表达式

虽然 Lua 没有像 C 语言那样的 ? : 三元操作符,但我们可以通过 andor 实现类似功能,尤其适合简单赋值场景。

-- 示例:判断是否为奇数并输出结果
local number = 7
local result = (number % 2 == 1) and "奇数" or "偶数"
print("数字 " .. number .. " 是 " .. result)

注释:

  • (number % 2 == 1) 判断是否为奇数,返回布尔值。
  • and 会先计算左边表达式,如果为 true,则返回右边的值;否则返回左边的值。
  • or 则是“左边为 false 时才取右边”。
  • 这种写法简洁高效,适合在表达式中使用。

⚠️ 注意:andor 的短路特性必须理解清楚,避免误用。例如 a and b or ca 为 false 时不会执行 b,直接返回 c


循环结构:让程序“重复”地工作

生活中有很多重复的动作,比如每天刷牙、每周打卡。程序也常常需要重复执行某些操作,这时就需要循环。Lua 提供了三种循环结构:whilerepeat-untilfor

while 循环:先判断再执行

-- 示例:从1累加到10
local sum = 0
local i = 1

while i <= 10 do
    sum = sum + i
    i = i + 1  -- 记得递增,否则会死循环!
end

print("1 到 10 的和是:" .. sum)

注释:

  • while i <= 10 do 表示只要 i 小于等于 10,就继续执行循环体。
  • 每次循环结束后,i 增加 1,防止无限循环。
  • 这种结构适合“不确定次数”的场景,比如等待用户输入有效值。

repeat-until 循环:先执行再判断

-- 示例:让用户输入正确的密码
local password = ""
local correct = "123456"

repeat
    print("请输入密码:")
    password = io.read()  -- 从控制台读取输入
until password == correct

print("密码正确,欢迎登录!")

注释:

  • repeatuntil 构成循环,至少执行一次。
  • 条件在循环体末尾判断,只要不满足 until 后的条件,就继续循环。
  • 适合“必须执行一次”的场景,比如登录验证、菜单选择。

for 循环:精准控制次数

-- 示例:打印 1 到 5 的平方
for i = 1, 5 do
    print(i .. " 的平方是 " .. i * i)
end

注释:

  • for i = 1, 5 do 表示 i 从 1 开始,到 5 结束,每次递增 1。
  • 你可以自定义步长,比如 for i = 1, 10, 2 表示每次加 2,输出奇数。
  • 适合已知循环次数的场景,代码简洁清晰。

循环控制:break 与 continue 的使用

在循环中,有时我们需要提前结束或跳过某次执行。Lua 提供了 breakgoto(不推荐)来控制流程。

-- 示例:查找第一个能被 3 整除的数
local numbers = {1, 4, 6, 8, 9, 12}

for i, num in ipairs(numbers) do
    if num % 3 == 0 then
        print("找到第一个能被 3 整除的数:" .. num)
        break  -- 找到后立即退出循环
    end
    print("检查 " .. num)
end

注释:

  • break 用于立即跳出当前最内层的循环。
  • 适用于“找到目标就停止”的场景,比如搜索、验证。

⚠️ 注意:Lua 没有 continue 关键字,但可以通过 if 嵌套实现跳过逻辑:

-- 模拟 continue:跳过偶数
for i = 1, 10 do
    if i % 2 == 0 then
        -- 跳过偶数,相当于 continue
        goto continue
    end
    print("奇数:" .. i)
    ::continue::
end

注释:

  • goto 是 Lua 的标签语法,::label:: 定义标签,goto label 跳转。
  • 虽然功能强大,但过度使用会让代码难以阅读,建议谨慎使用。

表达式与逻辑运算:构建复杂判断

在实际开发中,判断条件往往不是单一的。我们需要组合多个条件,这时就需要逻辑运算符:andornot

-- 示例:判断用户是否有权限访问系统
local is_admin = true
local is_logged_in = true
local is_verified = false

if is_admin and is_logged_in and is_verified then
    print("欢迎管理员进入后台系统")
elseif is_logged_in and is_verified then
    print("欢迎普通用户,但无权限访问后台")
else
    print("请先登录并完成身份验证")
end

注释:

  • and 要求所有条件都为 true 才返回 true。
  • or 只要有一个为 true 就返回 true。
  • not 取反操作,如 not true 返回 false
  • 这些运算符支持短路求值,提升性能。

实际案例:学生成绩管理系统

让我们把所有知识整合起来,写一个简单的学生成绩管理程序。

-- 学生成绩管理系统
local students = {
    {name = "张三", score = 88},
    {name = "李四", score = 55},
    {name = "王五", score = 92},
    {name = "赵六", score = 70}
}

print("=== 学生成绩统计 ===")

for i, student in ipairs(students) do
    local grade = ""
    if student.score >= 90 then
        grade = "优秀"
    elseif student.score >= 80 then
        grade = "良好"
    elseif student.score >= 70 then
        grade = "中等"
    elseif student.score >= 60 then
        grade = "及格"
    else
        grade = "不及格"
    end

    print(string.format("%d. %s: %d 分 (%s)", i, student.name, student.score, grade))
end

-- 统计及格率
local pass_count = 0
for _, student in ipairs(students) do
    if student.score >= 60 then
        pass_count = pass_count + 1
    end
end

local pass_rate = (pass_count / #students) * 100
print(string.format("及格率:%d%%", math.floor(pass_rate)))

注释:

  • ipairs 遍历数组,pairs 遍历键值对。
  • string.format 用于格式化输出,类似 C 语言的 printf
  • #students 获取表的长度。
  • math.floor 取整,用于展示百分比。

总结:掌握流程控制,让代码“有逻辑”

Lua 流程控制是编写有效程序的基础。从简单的 if-else 判断,到灵活的 forwhile 循环,再到复杂条件组合,每一步都让你的程序更智能、更高效。

记住,好的代码不只是“能运行”,更是“能理解”。清晰的流程控制,能让别人(包括未来的你)一眼看懂逻辑走向。无论是写脚本、做游戏逻辑,还是开发小型系统,熟练掌握 Lua 流程控制都将为你打下坚实基础。

现在,不妨动手试试:把上面的成绩系统改造成支持用户输入的功能,加入“重新输入”的循环,你会发现,真正的编程乐趣,就藏在这些“选择”与“重复”之中。