Lua语言特色
【1】多重赋值
多重赋值规则:若值的个数少于变量的个数,那么多余的变量会被赋值为nil
若值的个数多余变量的个数,那么多余的值会被“悄悄地”丢弃掉。
多重赋值应用示例:
1 a, b = 10, 2*3 2 print(a, b) -- 10 6 3 4 a, b, c = 0, 1 5 print(a, b, c) -- 0 1 nil 6 7 a, b = a+1, b+1, b+2 8 print(a, b) -- 1 2 9 10 a, b, c = 0 11 print(a, b, c) -- 0 nil nil
【2】repeat
一条repeat-until语句,重复执行其循环体,直到条件为真时结束。
repeat控制语句示例:
1 local a = 10 2 repeat 3 a = a + 10 4 print(a) 5 until a == 100 6 7 8 --[[执行结果 9 20 10 30 11 40 12 50 13 60 14 70 15 80 16 90 17 100 18 ]]
【3】elseif结构
由于Lua不支持switch语句,所以这种一连串的if-elseif 代码是很常见的。
elseif应用示例:
1 if op == "+" then 2 r = a + b 3 elseif op == "-" then 4 r = a - b 5 elseif op == "*" then 6 r = a * b 7 elseif op == "/" then 8 r = a / b 9 else 10 error("invalid operation") 11 end
【4】数字型for 和 泛型for
(1)数字型for
数字型for语法如下:
1 for var = exp1, exp2, exp3 do 2 <执行体> 3 end
var从exp1开始,以步长exp3(step)递增至exp2,每次变化执行一次"执行体"
第三个表达式exp3是可选的,若不指定,默认步长为1。如下示例:
1 for i = 1, 10, 1 do 2 print("i =", i) 3 end 4 5 --[[ 6 i = 1 7 i = 2 8 i = 3 9 i = 4 10 i = 5 11 i = 6 12 i = 7 13 i = 8 14 i = 9 15 i = 10 16 ]]
(2)泛型for
泛型for循环通过一个迭代器(iterator)函数来遍历所有值。示例如下:
1 --打印数组的所有值 2 a = {11, 12, 13, 14, 15} 3 for i, v in ipairs(a) do 4 print(i, v) 5 end 6 7 --[[ 8 1 11 9 2 12 10 3 13 11 4 14 12 5 15 13 ]]
Lua标准库提供了几种迭代器,包括用于迭代文件中每行的io.lines、迭代table元素的pairs、迭代数组元素的ipairs、迭代字符串中单词的string.gmatch等
刚刚写示例时候,无意写了几个这样的for循环,开始懵圈了。。。。。。
1 --打印数组的所有值 2 a = {11, 12, 13, 14, 15} 3 for i, v in ipairs(a) do 4 print(i, v) 5 end 6 7 --[[ 8 1 11 9 2 12 10 3 13 11 4 14 12 5 15 13 ]] 14 15 for v in ipairs(a) do 16 print(v) 17 end 18 19 --[[ 20 1 21 2 22 3 23 4 24 5 25 ]] 26 27 for k in pairs(a) do 28 print(k) 29 end 30 31 --[[ 32 1 33 2 34 3 35 4 36 5 37 ]] 38 39 for i, v in pairs(a) do 40 print(v) 41 end 42 43 --[[ 44 11 45 12 46 13 47 14 48 15 49 ]]
那么,到底pairs和ipairs两个容器函数到底有什么区别呢?
请再看以下的分析:
1 local table1 = { 2 [3] = "abc", 3 [4] = "def", 4 [5] = "ghi"} 5 6 for k, v in ipairs(table1) do 7 print(k, v) 8 end
上面这个for循环,竟然没有输出任何东东,下面继续看,我们把容器函数改为pairs,如下所示:
1 local table1 = { 2 [3] = "abc", 3 [4] = "def", 4 [5] = "ghi"} 5 6 for k, v in pairs(table1) do 7 print(k, v) 8 end 9 10 --则会输出所有 11 --[[执行结果 12 3 abc 13 4 def 14 5 ghi 15 ]]
输出了所有内容。再改变一下表的内容,继续观察,如下示例:
1 --现在改变一下表内容 2 local table2 = { 3 [1] = "abc", 4 [2] = "def", 5 [7] = "ghi"} 6 7 for k, v in ipairs(table2) do 8 print(k, v) 9 end 10 11 --[[执行结果 12 1 abc 13 2 def 14 ]] 15 16 for k, v in pairs(table2) do 17 print(k, v) 18 end 19 20 --[[执行结果 21 1 abc 22 2 def 23 7 ghi 24 ]]
还记得这节时,我们谈及到“Lua标准库提供了迭代table元素的pairs、迭代数组元素的ipairs”这句话了么?
现在想想,ipairs容器函数遍历的是数组,既然是数组,那么就需要从索引为1开始遍历,如果某个索引对应的值为nil,直接视为数组结束,退出循环。
pairs容器函数遍历的是表,既然是表,那么就可以遍历表中所有的key。
下面再看几个验证示例:
1 local table3 = { 2 [1] = "liu", 3 [4] = "wang", 4 [5] = "zhao"} 5 6 for i, v in pairs(table3) do 7 print(table3[i]) 8 end 9 10 --[[执行结果 11 liu 12 wang 13 zhao 14 ]] 15 16 for i, v in ipairs(table3) do 17 print(table3[i]) 18 end 19 20 --[[执行结果 21 liu 22 ]] 23 24 -- [[示例2.]] 25 26 local table4 = {"alpha", "beta", [3] = "ios", ["two"] = "dos", [5] = "windows"} 27 28 for i, v in ipairs(table4) do 29 print(table4[i]) 30 end 31 32 --[[执行结果 33 alpha 34 beta 35 ios 36 ]] 37 38 for i, v in pairs(table4) do 39 print(i, table4[i]) 40 end 41 42 --[[执行结 43 1 alpha 44 2 beta 45 3 ios 46 5 windows 47 two dos 48 ]]
结论:pairs可以遍历表中所有key,而ipairs只可以遍历表中数组值。
其实,言归正传,针对泛型for的使用,下面这个例子很常见。代码如下:
1 days = { 2 "Sunday", 3 "Monday", 4 "Tuesday", 5 "Wednesday", 6 "Thursday", 7 "Friday", 8 "Saturday" 9 } 10 11 revDays = {} 12 for k, v in pairs(days) do 13 revDays[v] = k 14 end 15 16 for i, k in pairs(days) do 17 print(i, k) 18 end 19 20 --[[ 执行结果 21 1 Sunday 22 2 Monday 23 3 Tuesday 24 4 Wednesday 25 5 Thursday 26 6 Friday 27 7 Saturday 28 ]] 29 30 for i, k in pairs(revDays) do 31 print(i, k) 32 end 33 34 --[[ 执行结果 35 Saturday 7 36 Tuesday 3 37 Wednesday 4 38 Friday 6 39 Sunday 1 40 Thursday 5 41 Monday 2 42 ]]
仔细体会一下其中的便捷性。
【5】其他
Good Good Study,Day Day Up.
顺序 选择 循环 总结