第5章 - 流程控制
嗨,朋友!我是长安。
流程控制是编程的基础,这一章我们来看看 Lua 的 if/else、for、while 怎么写。语法和 Java 有不少差异,但逻辑是完全相通的。
🔀 if / elseif / else
Lua 写法
local score = 85
if score >= 90 then
print("优秀")
elseif score >= 80 then
print("良好")
elseif score >= 60 then
print("及格")
else
print("不及格")
end
-- 预期输出:良好
Java 写法
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
语法对比
| 特性 | Java | Lua |
|---|---|---|
| 条件括号 | 必须 if (条件) | 不需要 if 条件 then |
| 代码块 | { } | then ... end |
| else if | else if | elseif(一个词!) |
| 结束标记 | } | end |
注意
Lua 的 elseif 是一个词,中间没有空格!写成 else if 虽然不会报错,但含义不同(变成嵌套的 if,需要两个 end)。
🔁 for 循环
数值 for(类似 Java 的 for-i)
-- 从 1 到 10,步长为 1(默认)
for i = 1, 10 do
print(i)
end
-- 从 1 到 10,步长为 2
for i = 1, 10, 2 do
print(i) -- 1, 3, 5, 7, 9
end
-- 倒序:从 10 到 1,步长为 -1
for i = 10, 1, -1 do
print(i) -- 10, 9, 8, ..., 1
end
// Java 等价写法
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
for (int i = 1; i <= 10; i += 2) {
System.out.println(i); // 1, 3, 5, 7, 9
}
for (int i = 10; i >= 1; i--) {
System.out.println(i); // 10, 9, 8, ..., 1
}
注意
Lua 的 for 循环是包含结束值的!for i = 1, 10 会执行到 i = 10。Java 的 for (int i = 1; i <= 10; i++) 也是,但 Java 程序员经常写 i < 10(不包含 10),注意区别。
泛型 for(类似 Java 的 for-each)
-- 遍历数组
local fruits = {"苹果", "香蕉", "橘子"}
for i, v in ipairs(fruits) do
print(i, v)
end
-- 1 苹果
-- 2 香蕉
-- 3 橘子
-- 遍历字典
local person = {name = "长安", age = 25, job = "Java开发"}
for k, v in pairs(person) do
print(k, v)
end
-- name 长安
-- age 25
-- job Java开发
// Java 等价写法
String[] fruits = {"苹果", "香蕉", "橘子"};
for (int i = 0; i < fruits.length; i++) {
System.out.println((i+1) + " " + fruits[i]);
}
Map<String, Object> person = Map.of("name", "长安", "age", 25);
for (Map.Entry<String, Object> entry : person.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
| 函数 | 说明 | 适用场景 |
|---|---|---|
ipairs() | 按索引顺序遍历 | 数组(连续整数索引) |
pairs() | 遍历所有键值对 | 字典 / 混合表 |
ipairs vs pairs
ipairs只遍历从 1 开始的连续整数索引,遇到nil就停pairs遍历所有键值对,但顺序不保证
🔄 while 循环
local count = 1
while count <= 5 do
print("第 " .. count .. " 次")
count = count + 1
end
// Java 等价写法
int count = 1;
while (count <= 5) {
System.out.println("第 " + count + " 次");
count++;
}
🔃 repeat...until(类似 Java 的 do...while)
-- Lua 的 repeat...until
local num = 1
repeat
print(num)
num = num + 1
until num > 5
-- 输出:1, 2, 3, 4, 5
// Java 的 do...while
int num = 1;
do {
System.out.println(num);
num++;
} while (num <= 5);
注意区别
- Lua 的
until后面是终止条件(条件为真时停止) - Java 的
while后面是继续条件(条件为真时继续) - 它们的条件是相反的!
until num > 5等价于while (num <= 5)
⏸️ break 和 goto
break
-- break 跳出当前循环
for i = 1, 10 do
if i == 5 then
break
end
print(i) -- 1, 2, 3, 4
end
goto(Lua 5.2+)
-- Lua 没有 continue!但可以用 goto 模拟
for i = 1, 10 do
if i % 2 == 0 then
goto continue -- 跳过偶数
end
print(i) -- 1, 3, 5, 7, 9
::continue:: -- 标签定义
end
Lua 没有 continue!
这是 Java 程序员最容易踩的坑之一。Lua 没有 continue 关键字!如果你想跳过某次循环,有两种方案:
方案一:用 goto 模拟(推荐)
for i = 1, 10 do
if i % 2 == 0 then goto continue end
print(i)
::continue::
end
方案二:用 if 包裹
for i = 1, 10 do
if i % 2 ~= 0 then
print(i)
end
end
🚫 Lua 没有 switch
Lua 没有 switch/case 语句,通常用 if/elseif 或 Table 来替代:
-- 方法一:if/elseif
local day = "Monday"
if day == "Monday" then
print("星期一")
elseif day == "Tuesday" then
print("星期二")
elseif day == "Wednesday" then
print("星期三")
else
print("其他")
end
-- 方法二:Table 查找(更优雅)
local dayMap = {
Monday = "星期一",
Tuesday = "星期二",
Wednesday = "星期三",
}
print(dayMap[day] or "其他")
Table 查找
用 Table 替代 switch 是 Lua 的常见做法,代码更简洁,性能也更好。这种模式在后面的章节中还会反复出现。
📝 小结
| 特性 | Java | Lua |
|---|---|---|
| 条件语句 | if () { } | if ... then ... end |
| else if | else if | elseif(一个词) |
| for 循环 | for (;;) | for i = start, end, step do |
| 增强 for | for (x : list) | for k, v in pairs/ipairs(t) do |
| do-while | do { } while() | repeat ... until |
| continue | ✅ 有 | ❌ 没有(用 goto 模拟) |
| switch | ✅ 有 | ❌ 没有(用 Table 替代) |
| 代码块结束 | } | end |
➡️ 下一步
流程控制掌握了!下一章我们来学习 函数,这是 Lua 最强大的特性之一。
💪 练习题
- 写一个 Lua 程序,判断一个数是奇数还是偶数。
- 用 for 循环打印 1 到 100 之间所有能被 3 整除的数。
- Lua 的
repeat...until和 Java 的do...while有什么区别? - 如何在 Lua 中实现类似
continue的效果?
答案提示
if num % 2 == 0 then print("偶数") else print("奇数") endfor i = 1, 100 do if i % 3 == 0 then print(i) end enduntil后是终止条件(为真停止),while后是继续条件(为真继续),条件相反- 用
goto+ 标签模拟,或用if包裹需要执行的代码
