Skip to content

3.4.9 - 表的构造

表构造即创建表的表达式。每当构造语句生效,都会创建一个新表。构造语句可以用来创建空表或创建并初始化一个表。构造语句的通用语法为:

tableconstructor ::= ‘{’ [fieldlist] ‘}’
fieldlist ::= field {fieldsep field} [fieldsep]
field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
fieldsep ::= ‘,’ | ‘;’

其中,以 [exp1] = exp2 这种形式表示的属性部分会使得新表中新增一个键为exp1、键值为exp2的字段。以name = exp形式表示的属性部分等效于["name"] = exp表示。exp 形式的属性部分等效于形式 [i] = exp ,这里的i为从1开始的连续整数;其他形式中的属性表示不影响其计数。例如:

lua
a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }

等效于:

lua
do
  local t = {}
  t[f(1)] = g
  t[1] = "x"         -- 第一个exp
  t[2] = "y"         -- 第二个exp
  t.x = 1            -- t["x"] = 1
  t[3] = f(x)        -- 第三个exp
  t[30] = 23
  t[4] = 45          -- 第四个exp
  a = t
end

关于构造语句中的赋值顺序则是未定义的。(这里指对于重复的键而言的顺序。)

如果构造列表中的最后一个属性是exp形式且是个多值复合表达式,那么其产生的所有值则依次进入到构造列表中。(参见3.4.12

构造列表的属性间的分隔符后缀是可选可,以方便生成机器码。