LUA学习(三) 基本语法

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值得改变而重新计算。
另外, 不符合for var = exp1, exp2, exp3 do 形式的for语句是不能正确执行的,如:

i = 1
for i, 10, 2 do
	print(i)
end
必须改成:

i = 1
for var = i, 10, 2 do
	print(var)
end


跳出循环可以使用break语句。


泛型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


类似这种的table是不能用泛型for循环的:

a = {x = 1, y = 2, z = 3}



















你可能感兴趣的:(Lua)