【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 = 011 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 2010 3011 4012 5013 6014 7015 8016 9017 10018 ]]
【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 else10 error("invalid operation")11 end
【4】数字型for 和 泛型for
(1)数字型for
数字型for语法如下:
1 for var = exp1, exp2, exp3 do2 <执行体> 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 = 410 i = 511 i = 612 i = 713 i = 814 i = 915 i = 1016 ]]
(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 1210 3 1311 4 1412 5 1513 ]]
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 1210 3 1311 4 1412 5 1513 ]]14 15 for v in ipairs(a) do16 print(v)17 end18 19 --[[20 121 222 323 424 525 ]]26 27 for k in pairs(a) do28 print(k)29 end30 31 --[[32 133 234 335 436 537 ]]38 39 for i, v in pairs(a) do40 print(v)41 end42 43 --[[44 1145 1246 1347 1448 1549 ]]
那么,到底pairs和ipairs两个容器函数到底有什么区别呢?
请再看以下的分析:
1 local table1 = {2 [3] = "abc",3 [4] = "def",4 [5] = "ghi"}5 6 for k, v in ipairs(table1) do7 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 abc13 4 def14 5 ghi15 ]]
输出了所有内容。再改变一下表的内容,继续观察,如下示例:
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 end10 11 --[[执行结果12 1 abc13 2 def14 ]]15 16 for k, v in pairs(table2) do17 print(k, v)18 end19 20 --[[执行结果21 1 abc22 2 def23 7 ghi24 ]]
还记得这节时,我们谈及到“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 liu12 wang13 zhao14 ]]15 16 for i, v in ipairs(table3) do17 print(table3[i])18 end19 20 --[[执行结果21 liu22 ]]23 24 -- [[示例2.]]25 26 local table4 = { "alpha", "beta", [3] = "ios", ["two"] = "dos", [5] = "windows"}27 28 for i, v in ipairs(table4) do29 print(table4[i])30 end31 32 --[[执行结果33 alpha34 beta35 ios36 ]]37 38 for i, v in pairs(table4) do39 print(i, table4[i])40 end41 42 --[[执行结43 1 alpha44 2 beta45 3 ios46 5 windows47 two dos48 ]]
结论: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) do13 revDays[v] = k14 end15 16 for i, k in pairs(days) do17 print(i, k)18 end19 20 --[[ 执行结果21 1 Sunday22 2 Monday23 3 Tuesday24 4 Wednesday25 5 Thursday26 6 Friday27 7 Saturday28 ]]29 30 for i, k in pairs(revDays) do31 print(i, k)32 end33 34 --[[ 执行结果35 Saturday 736 Tuesday 337 Wednesday 438 Friday 639 Sunday 140 Thursday 541 Monday 242 ]]
仔细体会一下其中的便捷性。
【5】其他
Good Good Study,Day Day Up.
顺序 选择 循环 总结