博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua语言特色
阅读量:5814 次
发布时间:2019-06-18

本文共 4045 字,大约阅读时间需要 13 分钟。

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

顺序 选择 循环 总结

转载地址:http://eombx.baihongyu.com/

你可能感兴趣的文章
BZOJ1997:[HNOI2010]PLANAR——题解
查看>>
BZOJ1014:[JSOI2008]火星人prefix——题解
查看>>
使用Unity3D引擎开发赛车游戏
查看>>
HTML5新手入门指南
查看>>
淘宝NPM镜像cnpm
查看>>
opennebula 开发记录
查看>>
ubuntu 修改hostname
查看>>
【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
查看>>
javascript call()
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>
6、Web Service-拦截器
查看>>
面试题: 数据库 oracle数据库 已看1 意义不大 有用
查看>>
Flask 源码流程,上下文管理
查看>>
stream classdesc serialVersionUID = -7218828885279815404, local class serialVersionUID = 1.
查看>>
ffmpeg相关资源
查看>>
ZAB与Paxos算法的联系与区别
查看>>
java 读取本地的json文件
查看>>
Breaking parallel loops in .NET C# using the Stop method z
查看>>
Android Content Provider Guides
查看>>