lua可以像c一样,几乎支持所有的传统的赋值语句、流程控制语句、函数调用等,同时也支持非传统的多变量赋值语句、局部变量声明等。
赋值语句:
可以使用传统的赋值语句,或者是lua支持的值格式,如:
a ="hello" .. " world"
b = 1
print(a) -->hello world
print(b) -->1
lua支持对多个变量的赋值,在语句中,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋值给左边的变量。如果变量数量不足,会丢弃多余的值。如果值数量不足,会将多余的变量赋值为nil。如:
a, b, c = 10, 6
print(a) -->10
print(b) -->6 print(c) -->nil
注意:多变量赋值的时候,lua解释器会先计算右侧的值,然后依次赋给左侧的变量。利用这个特性,可以很方便的完成变量值交换,如:
a, b = 10, 6
print(a) -->10
print(b) -->6
a, b = b, a
print(a) -->6
print(b) --10
注意:
如果要对多个变量赋值必须依次 对每个变量赋值。比如,将a,b,c都设置为0,下面的写法是错误的:
a, b, c = 0
这样的结果是:a = 0, b =nil, c =nil.
必须是下面这种写法:
a, b, c = 0, 0, 0
多变量赋值,多用来进行值交换,或是接收函数返回值。
a, b = f()
函数f()返回两个结果,第一个返回给a, 第二个返回给b。
局部变量和代码块(Block):
可以使用local来声明一个局部变量,局部变量只在当前的代码块中有效。一个代码块可以是一个控制流程,一个chunk或是一个函数。如:
function f()
local tmp = 10
print(tmp)
end
f() -->tmp = 10
print(tmp) --> nil
对tmp的赋值只在f()函数内部有效,在这个函数执行完后,tmp的值为nil。
结构控制语句:
在lua中,控制语句中的条件可以是任何值或表达式,只有当为false或是nil时,才认为是假的,否则均认为是真。
if语句有三种形式:
if conditions then
then-part
end;
if conditions then
then-part
else
else-part
end;
if conditions then
then-part
elseif conditions then
elseif-part
.. --->多个 elseif
else
else-part
end;
while语句的形式:
while condition do
statements;
end;
repeat-until语句的形式:
repeat
statements;
until conditions;
if和while语句基本上与C语言的差不多,只不过是写法上有些差别。repeat-until相当于do-while语句。
for循环语句的形式:
for var=exp1,exp2,exp3 do
loop-part
end
exp1为开始值,exp2为终止值,exp3为步长,如果exp3不存在,则以1为默认步长。
注意:for内的第三个参数,最终形式都必须是可得到的值,如果是表达式也必须可计算才行,不能是nil。如果这三个变量时最新定义的变量,则使用域只在for循环内部。如:
for i = 0,b,1 do
print(i)
end
以上的代码会报错,因为b为nil,不能被正确解释,三个参数都必须是可计算的值才行。
b = 10
for i = 0,b do
print("i = " .. i)
end
print(i)
以上代码中,for后面只有两个参数,未指明步长,默认步长就是1。另外,局部变量i的作用域是for循环内部,一旦for循环执行完成,i 就被删除了,所以最终的打印结果为:
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
nil
注意:如果exp1、exp2、exp3为表达式,则这三个表达式只会在循环前被执行一次,不会每次循环都重新计算。如:
a = 10; b = 8
for var = (a + 2), a + b, a - b do
a = a + 2
b = b + 3
print("var=" .. var .. " a=" .. a .. " b=" .. b)
end
执行结果为:
var=12 a=12 b=11
var=14 a=14 b=14
var=16 a=16 b=17
var=18 a=18 b=20
通过以上函数,可以看出,for循环的三个表达式,只在循环前被执行了一次。没有随着a、b值得改变而重新计算。
i = 1
for i, 10, 2 do
print(i)
end
必须改成:
i = 1
for var = i, 10, 2 do
print(var)
end
泛型for循环:
lua中,泛型for循环通过lua库提供的迭代器函数来遍历所有值,类似java中的foreach语句。注意:泛型for循环只能用于数组型table
形式为:
for i,v in ipairs(a) do
print(v)
end
其中 i 为数组a的键值,v 为数组a内元素的值。如:
a = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(a) do
print("a[" .. i .. "]" .. " = " .. v)
end
执行结果为:
a[1] = Suanday
a[2] = Monday
a[3] = Tuesday
a[4] = Wednesday
a[5] = Thursday
a[6] = Friday
a[7] = Saturday
a = {x = 1, y = 2, z = 3}