Lua 小白入门教程Lua 小白入门教程
首页
基础教程
实战进阶
编程指南
首页
基础教程
实战进阶
编程指南
  • 基础教程

    • 📚 基础教程
    • 第1章 - Lua 是什么?
    • 第2章 - 环境搭建
    • 第3章 - 变量与数据类型
    • 第4章 - 运算符与表达式
    • 第5章 - 流程控制
    • 第6章 - 函数
    • 第7章 - Table(表)
    • 第8章 - 字符串与模式匹配

第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("不及格");
}

语法对比

特性JavaLua
条件括号必须 if (条件)不需要 if 条件 then
代码块{ }then ... end
else ifelse ifelseif(一个词!)
结束标记}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 的常见做法,代码更简洁,性能也更好。这种模式在后面的章节中还会反复出现。

📝 小结

特性JavaLua
条件语句if () { }if ... then ... end
else ifelse ifelseif(一个词)
for 循环for (;;)for i = start, end, step do
增强 forfor (x : list)for k, v in pairs/ipairs(t) do
do-whiledo { } while()repeat ... until
continue✅ 有❌ 没有(用 goto 模拟)
switch✅ 有❌ 没有(用 Table 替代)
代码块结束}end

➡️ 下一步

流程控制掌握了!下一章我们来学习 函数,这是 Lua 最强大的特性之一。

💪 练习题

  1. 写一个 Lua 程序,判断一个数是奇数还是偶数。
  2. 用 for 循环打印 1 到 100 之间所有能被 3 整除的数。
  3. Lua 的 repeat...until 和 Java 的 do...while 有什么区别?
  4. 如何在 Lua 中实现类似 continue 的效果?

答案提示

  1. if num % 2 == 0 then print("偶数") else print("奇数") end
  2. for i = 1, 100 do if i % 3 == 0 then print(i) end end
  3. until 后是终止条件(为真停止),while 后是继续条件(为真继续),条件相反
  4. 用 goto + 标签模拟,或用 if 包裹需要执行的代码
最近更新: 2026/2/27 17:54
Contributors: 王长安
Prev
第4章 - 运算符与表达式
Next
第6章 - 函数