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
是条件判断的核心结构,它根据布尔表达式的值(true
或 false
)决定执行哪段代码。例如,判断用户输入的年龄是否达到成年标准:
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) -- 输出 "舒适"
注意:由于 and
和 or
的优先级较低,复杂条件建议使用 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-until
与 while
相反,先执行循环体,再判断条件。这意味着代码块至少运行一次。例如,模拟用户必须输入有效年龄的场景:
repeat
print("请输入年龄(1-120):")
local age = tonumber(io.read())
until age and age >= 1 and age <= 120
对比:while
是“先问路再走路”,repeat-until
是“先走一步再问路”。
for 循环:迭代与计数的灵活选择
Lua 的 for
循环有两种形式:
- 数值循环:用于已知次数的循环,例如遍历数组。
- 泛型循环:用于遍历表(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("循环结束")
建议:优先用 break
和 return
替代 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)
分析:
- 使用
math.random
生成随机目标值。 repeat-until
确保用户至少输入一次。if-else
根据猜测值调整提示信息。
总结:构建高效逻辑的四大要点
- 明确需求:在编写代码前,用自然语言描述逻辑分支和循环条件。
- 选择合适结构:根据场景选择
while
、for
或repeat-until
,避免结构嵌套过深。 - 简化条件表达式:通过提前返回或提炼函数,减少
if-else
的复杂度。 - 测试与调试:使用
print
或调试工具验证流程是否符合预期。
掌握 Lua 流程控制后,开发者可以像指挥家一样,让代码的每个部分协调运转。无论是构建游戏逻辑、数据处理脚本,还是自动化任务,流程控制都是实现复杂功能的基础。通过不断实践和优化,你将能够编写出更高效、更健壮的 Lua 程序。
(字数统计:约 1800 字)