if / elseif / else
if x > 0 then
print("正")
elseif x == 0 then
print("零")
else
print("负")
end
没有花括号,关键字 then / end 划范围。elseif 是一个词(不是 else if)。
while
local n = 0
while n < 5 do
print(n)
n = n + 1
end
repeat ... until
local n = 0
repeat
print(n)
n = n + 1
until n >= 5
类似 do...while——条件在末尾、为真时停(注意是停,不是继续)。
特别之处:until 表达式里可以访问循环体内 local 变量。
数值 for
for i = 1, 10 do print(i) end -- 1, 2, ..., 10
for i = 1, 10, 2 do print(i) end -- 1, 3, 5, 7, 9(步长 2)
for i = 10, 1, -1 do print(i) end -- 10, 9, ..., 1(倒序)
for i = start, stop, step do ... end。包含两端——for i = 1, 10 是 1 到 10。
泛型 for
遍历可迭代结构。最常用两个:
-- 遍历数组(顺序)
local arr = {"a", "b", "c"}
for i, v in ipairs(arr) do
print(i, v) -- 1 a / 2 b / 3 c
end
-- 遍历表(无序)
local t = {name = "Alice", age = 30}
for k, v in pairs(t) do
print(k, v)
end
| 用法 | |
|---|---|
ipairs(arr) |
整数键 1..n,按顺序,遇到 nil 停 |
pairs(t) |
所有键,无序 |
第 06 篇 详讲两者区别。
break / continue
break 有,continue 没有——用 goto:
for i = 1, 10 do
if i % 2 == 0 then goto next end
print(i)
::next::
end
-- 1 3 5 7 9
::label:: 是标签语法。
Lua 没
continue是设计选择——作者认为 goto 已足够。习惯就好。
goto 的限制
goto done -- ✅ 跳到本块或外层
::done::
不能跳进 local 变量作用域中间,不能跳进 for / while 内部。其他用法都行——比 C 的 goto 安全。
三元运算(用 and / or 模拟)
local sign = x > 0 and "正" or "负"
坑:如果"真分支"是 false 或 nil,会跳到 or 后面:
local x = true and false or "default"
print(x) -- "default",不是 false
需要严格三元用 if-else:
local x
if cond then x = a else x = b end
do ... end
显式作用域块——用来限制 local:
do
local tmp = expensive()
process(tmp)
end
-- tmp 在这里已经不可见
也用来包多语句给 until / 限制变量寿命。
数据驱动的"switch"
Lua 没 switch。用表分发:
local handlers = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end,
mul = function(a, b) return a * b end,
}
local op = "add"
local result = handlers[op] and handlers[op](3, 4) or 0
→ 下一篇 Table——Lua 的"万能数据结构"