table 构造子是一个构造 table 的表达式。 每次构造子被执行,都会构造出一个新的 table 。 构造子可以被用来构造一个空的 table, 也可以用来构造一个 table 并初始化其中的一些域。 一般的构造子的语法如下
tableconstructor ::= `{´ [fieldlist] `}´ fieldlist ::= field {fieldsep field} [fieldsep] field ::= `[´ exp `]´ `=´ exp | Name `=´ exp | exp fieldsep ::= `,´ | `;´
每个形如 [exp1] = exp2
的域向 table 中增加新的一项,
其键值为 exp1
而值为 exp2
。
形如 name = exp
的域等价于
["name"] = exp
。
最后,形如 exp
的域等价于
[i] = exp
, 这里的 i
是一个从 1 开始不断增长的数字。
这这个格式中的其它域不会破坏其记数。
举个例子:
a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
等价于
do local t = {} t[f(1)] = g t[1] = "x" -- 1st exp t[2] = "y" -- 2nd exp t.x = 1 -- t["x"] = 1 t[3] = f(x) -- 3rd exp t[30] = 23 t[4] = 45 -- 4th exp a = t end
如果表单中最后一个域的形式是 exp
,
而且其表达式是一个函数调用或者是一个可变参数,
那么这个表达式所有的返回值将连续的进入列表
(参见 §2.5.8)。
为了避免这一点,你可以用括号把函数调用(或是可变参数)括起来
(参见 §2.5)。
初始化域表可以在最后多一个分割符, 这样设计可以方便由机器生成代码。