表构造器

简介: 表构造器

表构造器Table Constructor )是用来创建初始化表的表达式,也是 Lua 语言中独有的也是最有用最灵活的机制之一。


列表式

正如我们此前已经提到的,最简单的构造器是空构造器{} 。表构造器也可以被用来初始化表。例如:

days = {
    "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
}
print(days[4]) -- > Wednesday


记录式

Lua 语言还提供了一种初始化记录式(record-like)表的特殊语法:

a = {x = 10, y = 20}


上述代码等价于:

a = {}
a.x = 10
a.y = 20


不过,在第一种写法中,由于能够提前判断表的大小,所以运行速度更快。


无论使用那种方式创建表,都可以随时增加或删除表元素。

w = {x = 0, y = 0, label = "console"}
x = {math.sin(0), math.sin(1), math.sin(2)}
w[1] = "another field"                          -- 把键1增加到表'w'中
x.f = w                                         -- 把键"f"增加到表'x'中
print(w["x"])                                   --> 0
print(w[1])                                     --> another field
print(x.f[1])                                   --> another field
w.x = nil                                       --> 删除字段'x'


不错,正如此前所提到的,使用合适的构造器来创建表会更加高效和易读。


在同一个构造器中,可以混用记录式(record-style)和列表式(list-style)写法:

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


上述的示例也同时展示了如何创建嵌套表(和构造器)以表达更加复杂的数据结构。每一个元素 polyline[i] 都代表一条记录的表:

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


括号式

不过,这两种构造器都有各自的局限。例如:使用这两种构造器时,不能使用负数索引初始化表元素,也不能使用不符合规范的标识符作为索引。对于这类需求,可以使用另一种更加通用的构造器,即通过方括号括起来的表达式显示地指定每一个索引:

opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
i = 20
s = "-"
a = {[i + 0] = s, [i + 1] = s .. s, [i + 2] = s .. s .. s}
print(opnames[s])       --> sub
print(a[22])            --> ---


这种构造器虽然冗长,但却非常灵活,不管是记录式构造器还是列表式构造器均是其特殊形式。例如,下面的集中表达式就相互等价

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


在最后一个元素后总是可以紧跟一个逗号。虽然总是有效,但是否加最后一个逗号是可选的:

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


这种灵活性似的开发人员在编写表构造器时不需要对最后一个元素进行特殊处理。


最后,表构造器中的逗号也可以使用分号代替,这主要是为了兼容 Lua 语言的旧版本,目前基本不会被用到。

目录
相关文章
|
存储 Java
构造方法中的this应用及注意事项
在Java中,"this"可以翻译为"本对象"或"对象本身",它指向的是当前的对象。类比日常生活中的称呼,当别人称呼你时应该使用你的姓名,比如称呼"赵云",可以说"赵云很帅"或者"赵云武功很强",但是赵云自己称呼自己时应该使用"我",比如"我很帅"或者"我武功很强"。在Java中,"我"相当于"this"。
139 3
|
5天前
|
Java 编译器
静态字段和静态方法3-14
静态字段和静态方法3-14
|
5月前
引用构造器练习
引用构造器练习
46 0
|
消息中间件 缓存 数据库
A和B接口同时修改table字段,无法确认调用顺序
在互联网应用开发中,经常会碰到多个接口同时需要修改数据库表字段的情况。然而,由于无法确认接口调用的顺序,可能会导致数据冲突和一致性问题。本文将介绍一种解决这一问题的方法,通过合理的设计和技术手段,确保同时修改table字段的操作能够顺利进行,数据一致性得到保障。
126 0
A和B接口同时修改table字段,无法确认调用顺序
|
Java
错误: 无法将类 HTable中的构造器 HTable应用到给定类型;
错误: 无法将类 HTable中的构造器 HTable应用到给定类型;
140 1
错误: 无法将类 HTable中的构造器 HTable应用到给定类型;
|
缓存 Dart 安全
Dart中的类——初始化列表、命名构造器、factory构造器、常量构造器、构造器私有化、get和set方法、枚举
Dart中的类——初始化列表、命名构造器、factory构造器、常量构造器、构造器私有化、get和set方法、枚举
|
JSON 数据格式
将Object类对象转为对应实体类对象
将Object类对象转为对应实体类对象
461 0
|
Java C++
C++类中在构造器中调用本类的另外构造器
C++类中在构造器中调用本类的另外构造器
93 0
|
Python
8.2 类的构造器
class ren():     '''this class is about ren class。类的说明,使用三个单引号'''     def __init__(self,name,sex):        # 构造器         # 注意到 __init__ 方法的...
669 0
|
Java
构造器、对象数组、对象属性、静态实例块、this关键字
它的名字:构造函数、构造方法、初始化方法。 构造条件? 以后我们如何去使用构造器? 你觉得那些对象中那些属性值是必要的,你就在构造器中提出来(就是你如果想创造对象必须要传入我所需要的参数) public class Dog {//这里就是一个简单的类、狗的类 String name; .
1121 0