Lua的语句支持赋值、控制结构、程序调用、多重赋值和局部变量声明。

一. 赋值
跟C语言等编程语言一样的语法,不再多说。

二. 多重赋值
下面这段代码分别给a赋值10,给b赋值20

a, b = 10, 20

因为多重赋值是先取值后赋值,通过多重赋值可以方便地实现交换值:

x, y = y, x

当要赋的值的个数比变量多,那么后面多余的会省略。
当要赋的值的个数比变量少,那么缺乏的将会由nil。

还有一个用途是用于接收有多个返回值的函数。如:

a, b = fun()

三. 局部变量和块
在变量前加上local就可以声明局部变量。
在交互模式下,由于每一条完整的语句都是一个块,因此要注意局部变量的范围只能在该行生效。你可以使用do-end来指定一个完整的块。
尽量使用局部变量是优秀的编程习惯,而且访问局部变量比访问全局变量速度要快。
一个常用的技巧是:

local foo = foo

这个技巧可以临时保存全局变量的值,并且使得访问变量更加快速。

四. 控制结构
Lua提供了if条件、while、repeat和for循环结构。Lua没有switch语句。

1.if then else
示例:

if a < 0 then 
    a = 0 
end
if a < b then
    return a
else
    return b
end
if op == "+" then
    r = a + b
elseif op == "-" then
    r = a - b
else
    error("invalid operation")
end

2.while
示例:

local i = 1
while a[i] do
    print(a[i])
    i = i + 1
end

3.repeat
示例:

repeat
    line = io.read()
until line ~= ""
print(line)

条件部分的变量的作用域是和循环体的作用域一样的。

4.数值for

for var = exp1, exp2, exp3 do
    <something>
end

exp3从exp1变化到exp2的步长,可选。
条件部分只会执行一次。不要改变循环条件的变量,这是未定义的行为。

5.通用for

for k,v in pairs(t) print(k,v) end

io.lines:迭代文件的每一行
pairs:迭代表中的键值对
ipairs:迭代顺序表中的入口
string.gmatch:迭代字符串的每一个单词

6.break、return和goto
break:用于打破循环。
return:只可用于块的最后一行。
goto:标签前后要加上双冒号。goto不可以跳入块(因为块中的标签在外部不可见),也不可以跳出函数,也不可以跳入局部变量的作用域。使用goto可以实现:continue,多重break,多重continue,redo,局部异常处理,有限状态机等等。需要注意的是,局部变量在块的最后一个非空语句前结束,而标签会视为空语句。

while some_condition do
    ::redo::
    if some_other_condition then goto continue
    else if yet_another_condition then goto redo
    end
    <some code>
    ::continue::