- 赋值语句
>赋值是改变一个变量的值和改变表域的最基本的方法
a = "hello" .. "world" b = 10 t.n = t.n + 1
>Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量
a, b = 10, 2*x <--> a=10; b=2*x
>遇到赋值语句 Lua 会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值
x, y = y, x -- swap 'x' for 'y' a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
>当变量个数和值的个数不一致时,Lua 会一直以变量个数为基础采取以下策略
a. 变量个数 > 值的个数 按变量个数补足 nil
b. 变量个数 < 值的个数 多余的值会被忽略a, b, c = 0, 1 print(a,b,c) --> 0 1 nil a, b = a+1, b+1, b+2 -- value of b+2 is ignored print(a,b) --> 1 2 a, b, c = 0 print(a,b,c) --> 0 nil nil
>多值赋值经常用来交换变量,或将函数调用返回给变量
--用f()返回两个值,第一个赋给 a,第二个赋给 b a, b = f()
- 局部变量与代码块(block)
使用 local 创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个 chunk(变量被声明的那个文件或者文本串)
x = 10 local i = 1 -- local to the chunk while i<=x do local x = i*2 -- local to the while body print(x) --> 2, 4, 6, 8, ... i = i + 1 end if i > 20 then local x -- local to the "then" body x = 20 print(x + 2) else print(x) --> 10 (the global one) end print(x) --> 10 (the global one)
>应该尽可能的使用局部变量,有两个好处:
1. 避免命名冲突
2. 访问局部变量的速度比全局变量更快.
我们给 block 划定一个明确的界限:do..end 内的部分。当你想更好的控制局部变量的作用范围的时候这是很有用的 - 控制结构语句
>if语句
-- 1 if conditions then --then-part end; -- 2 if conditions then --then-part else --else-part end; -- 3 if conditions then --then-part elseif conditions then --elseif-part .. --->多个 elseif else --else-part end;
2.while语句
while condition do statements; end;
3.repeat-until 语句-- 重复直到某个条件成立 repeat statements; until conditions;
4.for语句(有两大类)
第一,数值 for 循环for var=exp1,exp2,exp3 do loop-part end
for 将用 exp3 作为 step 从 exp1(初始值)到 exp2(终止值),执行 loop-part。其中exp3 可以省略,
默认 step=1
看下面例子:for i=1,10 do print(i) end -- step默认为1,输出1,2,3,4,5,6,7,8,9,10 for i=1,10,2 do print(i) end -- step设置为2,输出1,3,5,7,9
注意:
>查找一个元素的位置
1、三个表达式只会被计算一次,并且是在循环开始前
2、控制变量 var 是局部变量自动被声明,并且只在循环内有效
3、循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用 break 语句
-- find a value in a list local found = nil for i=1,a.n do if a[i] == value then found = i -- save value of 'i' break end end print(found)
--范型 for 遍历迭代子函数返回的每一个值 for i,v in ipairs(a) do print(v) end --遍历表 key -- print all keys of table 't' for k in pairs(t) do print(k) end
再看一个例子,假定有一个表
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
现在想把对应的名字转换成星期几,一个有效地解决问题的方式是构造一个反向表
revDays = {["Sunday"] = 1, ["Monday"] = 2, ["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5, ["Friday"] = 6, ["Saturday"] = 7}
获得Tuesday
x = "Tuesday" print(revDays[x]) --> 3
>我们不需要手工,可以自动构造反向表
revDays = {} for i,v in ipairs(days) do revDays[v] = i end
- break和return语句
>Lua 语法要求 break 和 return 只能出现在 block 的结尾一句(也就是说:作为 chunk的最后一句,或者在 end 之前,或者 else 前,或者 until 前),例如
local i = 1 while a[i] do if a[i] == v then break end i = i + 1 end
有时候为了调试或者其他目的需要在 block 的中间使用 return 或者 break,可以显式的使用 do..end 来实现
function foo () return --<< 这是错误的!!! -- 'return' is the last statement in the next block do return end -- 应该这样使用 ... -- statements not reached end