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.

顺序 选择 循环 总结

posted @ 2018-09-27 10:10  kaizenly  阅读(517)  评论(0编辑  收藏  举报
打赏