表的构造式就是创建并初始化表的表达式。它是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历史版本遗留下来的,我猜现在已经很少用到这个特性了。
原文:https://www.cnblogs.com/guoyujam/p/11419158.html