Lua 流程控制(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

什么是流程控制?

在编程的世界中,流程控制就像交通指挥系统,它决定了代码的执行顺序和分支方向。无论是判断用户输入是否合法,还是循环处理大量数据,流程控制都是程序逻辑的核心。在 Lua 中,流程控制通过条件语句、循环结构和跳转语句实现,帮助开发者灵活地组织代码,完成复杂任务。

对于初学者而言,掌握 Lua 的流程控制如同学会用乐高积木搭建复杂结构——通过基础模块的组合,可以创造出无限可能。


条件语句:程序的“决策树”

if-else:最基础的分支选择

if-else 是条件判断的核心结构,它根据布尔表达式的值(truefalse)决定执行哪段代码。例如,判断用户输入的年龄是否达到成年标准:

local age = 20  
if age >= 18 then  
    print("成年,可以投票")  
else  
    print("未成年,暂不能投票")  
end  

多条件判断:elseif 的妙用

当存在多个分支时,可以使用 elseif 进一步细化条件。例如根据成绩等级输出不同信息:

local score = 85  
if score >= 90 then  
    print("优秀")  
elseif score >= 70 then  
    print("良好")  
else  
    print("需要努力")  
end  

比喻if-else 结构就像一个分拣员,根据包裹的重量、尺寸等条件,将包裹分到不同的运输通道。


条件表达式:简洁的单行判断

Lua 支持三元运算符 condition and value1 or value2,用于在一行代码中完成简单条件判断。例如:

local temperature = 25  
local result = temperature > 30 and "炎热" or "舒适"  
print(result)  -- 输出 "舒适"  

注意:由于 andor 的优先级较低,复杂条件建议使用 if-else 以提高可读性。


循环结构:重复任务的高效工具

while 循环:条件满足时持续执行

while 循环会先判断条件,再决定是否执行循环体。适合在未知循环次数但有明确终止条件的场景。例如,计算 1 到 n 的和:

local sum = 0  
local n = 5  
local i = 1  
while i <= n do  
    sum = sum + i  
    i = i + 1  
end  
print("总和:" .. sum)  -- 输出 15  

比喻while 循环就像一位守门人,每次开门前都会检查“是否有人敲门”,如果有人(条件为真)就开门(执行循环体)。


repeat-until:至少执行一次的循环

repeat-untilwhile 相反,先执行循环体,再判断条件。这意味着代码块至少运行一次。例如,模拟用户必须输入有效年龄的场景:

repeat  
    print("请输入年龄(1-120):")  
    local age = tonumber(io.read())  
until age and age >= 1 and age <= 120  

对比while 是“先问路再走路”,repeat-until 是“先走一步再问路”。


for 循环:迭代与计数的灵活选择

Lua 的 for 循环有两种形式:

  1. 数值循环:用于已知次数的循环,例如遍历数组。
  2. 泛型循环:用于遍历表(table)或其他迭代器。

数值循环示例

-- 打印 1 到 5  
for i = 1, 5 do  
    print(i)  
end  

泛型循环示例

-- 遍历字符串的每个字符  
for index, char in ipairs({"a", "b", "c"}) do  
    print(index, char)  
end  

比喻:数值循环像“跑步机”,按照固定步数前进;泛型循环像“观光车”,沿着数据的路径自动行驶。


跳转语句:流程控制的“快捷通道”

break:立即终止循环

当需要提前结束循环时,使用 break。例如,在找到目标元素后停止搜索:

for i = 1, 10 do  
    if i == 5 then  
        break  
    end  
    print(i)  
end  
-- 输出 1 2 3 4 后终止  

goto:跳转到标签(慎用)

Lua 允许使用 goto 和标签(label)实现任意跳转,但过度使用会降低代码可读性。例如:

for i = 1, 10 do  
    for j = 1, 10 do  
        if i * j > 50 then  
            goto end_loop  
        end  
    end  
end  
::end_loop::  
print("循环结束")  

建议:优先用 breakreturn 替代 goto,避免“意大利面条式”代码。


函数中的流程控制:模块化的逻辑封装

函数与条件的结合

将条件逻辑封装在函数中,可以提高代码复用性和可维护性。例如:

function check_login(username, password)  
    if username == "admin" and password == "123456" then  
        return true  
    else  
        return false  
    end  
end  

返回值与流程控制

在函数中,return 可以立即终止执行并返回结果,常用于提前退出逻辑分支:

function divide(a, b)  
    if b == 0 then  
        return "除数不能为零"  
    end  
    return a / b  
end  

错误处理:程序的“安全网”

assert:断言式错误检测

assert 可在条件不满足时抛出错误,常用于调试或验证输入:

local value = 0  
assert(value > 0, "数值必须大于零")  -- 抛出错误  

pcall:保护调用

pcall(Protected Call)用于捕获函数执行中的错误,避免程序崩溃:

local status, result = pcall(divide, 10, 0)  
if not status then  
    print("错误:" .. result)  -- 输出 "错误:除数不能为零"  
end  

实战案例:综合应用流程控制

案例:猜数字游戏

通过组合 while 循环、if-else 和随机数生成,实现一个简单的猜数字游戏:

math.randomseed(os.time())  
local target = math.random(1, 100)  
local guess  

print("猜数字游戏(1-100):")  
repeat  
    guess = tonumber(io.read())  
    if guess > target then  
        print("太大了,再试一次!")  
    elseif guess < target then  
        print("太小了,再试一次!")  
    end  
until guess == target  
print("恭喜!正确答案是 " .. target)  

分析

  1. 使用 math.random 生成随机目标值。
  2. repeat-until 确保用户至少输入一次。
  3. if-else 根据猜测值调整提示信息。

总结:构建高效逻辑的四大要点

  1. 明确需求:在编写代码前,用自然语言描述逻辑分支和循环条件。
  2. 选择合适结构:根据场景选择 whileforrepeat-until,避免结构嵌套过深。
  3. 简化条件表达式:通过提前返回或提炼函数,减少 if-else 的复杂度。
  4. 测试与调试:使用 print 或调试工具验证流程是否符合预期。

掌握 Lua 流程控制后,开发者可以像指挥家一样,让代码的每个部分协调运转。无论是构建游戏逻辑、数据处理脚本,还是自动化任务,流程控制都是实现复杂功能的基础。通过不断实践和优化,你将能够编写出更高效、更健壮的 Lua 程序。


(字数统计:约 1800 字)

最新发布