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 "负"

:如果"真分支"是 falsenil,会跳到 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 的"万能数据结构"