| 脚本语法说明—语句 |
● 概述
● 赋值语句
● 局部变量与代码块
● 控制结构语句
● break与return
概述
● UL几乎支持所有的传统语句:赋值语句、控制结构语句、函数调用等,同时也支持非传统的多变量赋值、局部变量声明。
赋值语句
● UL可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。
Eg:
a, b = 10, 2*x <--> a=10; b=2*x
● 遇到赋值语句UL会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值。
Eg:
x, y = y, x -- swap ’x’ for ’y’
a[i], a[j] = a[j], a[i] -- swap ’a[i]’ for ’a[i]’
● 当变量个数和值的个数不一致时,UL会一直以变量个数为基础采取以下策略:
a. 变量个数>值的个数 按变量个数补足nil
b. 变量个数<值的个数 多余的值会被忽略
Eg:
a, b, c = 0, 1
uPrintf(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- value of b+2 is ignored
uPrintf(a,b) --> 1 2
a, b, c = 0
uPrintf(a,b,c) --> 0 nil nil
局部变量与代码块
● 局部变量:使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。
● 代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。
Eg:
x = 10
local i = 1 -- 给局部变量赋值
while i<= x do
local x = i*2
uPrintf(x) --> 2, 4, 6, 8, ...
i = i + 1
end
if I > 20 then
local x
x = 20
uPrintf(x + 2)
else
uPrintf(x) --> 10 (the global one)
end
uPrintf(x) --> 10 (the global one)
● 使用局部变量的好处 :
? 避免命名冲突。
? 访问局部变量的速度比全局变量更快.。
控制结构语句
● 控制结构的条件表达式结果可以是任何值,UL认为false和nil为假,其他值为真。
● if语句:先测试其条件,然后根据测试结果执行then部分或else部分,else部分是可选的,编写嵌套的if可使用elseif。
Eg:
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语句:UL先测试while的条件。如果条件为假,循环结束;不然,执行循环体并重复。
Eg:
local I = 1
while a[i] do
uPrintf (a[i])
i=i+1
end
● repeat:repeat-until语句重复执行其循环体直到条件为真时结束。循环体至少会执行一次。
● for语句:for语句有两种,数值for循环和范型for循环。
数值for循环:
Eg:
for var=exp1,exp2,exp3 do
loop-part
end
--[[ for将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1 ]]--
备注:
1. 三个表达式只会被计算一次,并且是在循环开始前。
2. 控制变量var是局部变量自动被声明,并且只在循环内有效.
3. 循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用break语句。
● 范型for循环:范型for遍历迭代子函数返回的每一个值。
Eg:
for k in pairs(t) do uPrintf(k) end -- 输出表中“t”的所有值
备注:范型for和数值for有两点相同
1. 控制变量是局部变量。
2. 不要修改控制变量的值。
break与return
● break语句用来退出当前循环(for,repeat,while)。在循环外部不可以使用。|
● return用来从函数返回结果,当一个函数自然结束结尾会有一个默认的return。
● UL语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前),
Eg:
local i = 1
while a[i] do
if a[i] == v then break end
i = i + 1
end