• 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.

    顺序 选择 循环 总结

  • 相关阅读:
    NativeXml (1):下载、安装、测试
    NativeXml (7):添加属性
    NativeXml (9):读取
    NativeXml (2):对象建立
    NativeXml (3):保存
    NativeXml (6):添加节点
    NativeXml (10):编辑
    NativeXml (5):事件
    博客园现代化建设—用 Entity Framework 与 Json.NET 实现数据的按需更新
    Entity Framework 小知识分享
  • 原文地址:https://www.cnblogs.com/Braveliu/p/9711638.html
Copyright © 2020-2023  润新知