首页 > 其他 > 详细

(浅)Lua学习笔记_Table 表

时间:2019-08-27 17:55:53      阅读:97      评论:0      收藏:0      [点我收藏+]

 

表的构造式就是创建并初始化表的表达式。它是Lua中非常独特的特性,也是Lua中最有用且灵活的机制之一。

Constructors are expressions that create and initialize tables. They are a distinctive feature of Lua and one of its most useful and versatile mechanisms.


 

  • 怎么创建一个表

   最简单的就是 "变量名 = 空的大括号{}" 。另外还可以用来初始化列表(数字下标数组)。例如,下面的表达式就将days[1]初始化为”Sunday”注意Lua中数字下标从1开始而不是0),days[2]”Monday”,以此类推: 

1 days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
2 
3 print(days[4])    --> 输出 :Wednesday

 


 

  • 把表作为字典使用

    • 字典的初始化

1 -- >Lua还提供一种特殊的语法来初始化记录(字典)类型的表,例如:
2 a = {x = 10, y = 20} 
3    
4 -- >以上写法等价于:
5 a = {}; a.x = 10; a.y = 20 

     值得注意的是,第一种写法执行速度更快,因为在创建表时表的大小已经确定了。

    • 字典的取值   

1 print(a["x"])  --> 输出:10
2 a["x"] = 9 -->赋值 9
3 
4 --> 以上写法等价于:
5 print(a.x)  --> 输出:9
6 a.x = 8 -->赋值 8

   无论采用哪种构造式来创建表,都可以在之后添加或者删除字段:

 1 w = {x = 0, y = 0, label = "console"}
 2 
 3 x = {math.sin(0), math.sin(1), math.sin(2)}
 4 
 5 w[1] = "another field"    -- 为表w添加入口1
 6 
 7 x.f = w    -- 为表x添加入口f
 8 
 9 print(w["x"])    --> 0
10 
11 print(w[1])    --> another field
12 
13 print(x.f[1])    --> another field
14 
15 w.x = nil    -- 删除w的入口x

    但是,如上面提到的,用合适的构造式来创建表更加高效,而且更简洁。


 

  • 在一个表内可以同时存在字典形式和列表形式

   在同一个构造式中,混用字典形式和列表形式的初始化方法:

1 polyline = {color="blue",
2             thickness=2,    
3             npoints=4,    
4             {x=0,    y=0},     -- polyline[1]
5             {x=-10,    y=0},    -- polyline[2]
6             {x=-10,    y=1},    -- polyline[3]
7             {x=0,    y=1}      -- polyline[4]
8             }

   上面的例子同样表明了如何嵌套表来表示复杂的数据结构。polyline[i]的每个元素都又指向了一个字典形式的表:

1 print(polyline[2].x)    -->    -10
2 print(polyline[4].y)    -->    1

   这两种构造式有一些问题。例如,无法构造具有负数下标的字段,也不能构造不符合变量命名规则的字符串下标。如果有这种需求,就要用到更普遍性的格式。也就是要明确写出字符串Key,并用中括号包围起来:

1 opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
2 
3 i = 20; s = "-"
4 
5 a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s}
6 
7 print(opnames[s])    --> sub
8 
9 print(a[22])    --> ---

   这种写法感觉更繁琐,但是也很好理解:列表形式与字典形式的初始化都是它的特例,下面的代码展示了等价的写法:

1 {x = 0, y = 0}    <->    {["x"] = 0, ["y"] = 0}
2 
3 {"r", "g", "b"}    <->    {[1] = "r", [2] = "g", [3] = "b"}

   为方便起见,最后一个元素后面可以带着逗号,也可以不带。带着逗号方便以后添加元素:

1 a = {[1] = "red", [2] = "green", [3] = "blue",}

   而且允许在最后元素之后带着逗号的写法,就不需要在很多情况下对最后一个元素进行特殊处理。

 

 


 

Finally, we can always use a semicolon instead of a comma in a constructor. This facility is a leftover from older Lua versions and I guess it is seldom used nowadays.

最后提一下,在构造式中总是可以用分号代替逗号。这个特性是Lua历史版本遗留下来的,我猜现在已经很少用到这个特性了。

 

(浅)Lua学习笔记_Table 表

原文:https://www.cnblogs.com/guoyujam/p/11419158.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!