2.4.3 - 赋值

Lua 允许多重赋值。 因此,赋值的语法定义是等号左边放一系列变量, 而等号右边放一系列的表达式。 两边的元素都用逗号间开:

	stat ::= varlist1 `=´ explist1
	varlist1 ::= var {`,´ var}
	explist1 ::= exp {`,´ exp}

表达式放在 §2.5 里讨论。

在作赋值操作之前, 那一系列的右值会被对齐到左边变量需要的个数。 如果右值比需要的更多的话,多余的值就被扔掉。 如果右值的数量不够需求, 将会按所需扩展若干个 nil。 如果表达式列表以一个函数调用结束, 这个函数所返回的所有值都会在对齐操作之前被置入右值序列中。 (除非这个函数调用被用括号括了起来;参见 §2.5)。

赋值段首先会做运算完所有的表达式,然后仅仅做赋值操作。 因此,下面这段代码

     i = 3
     i, a[i] = i+1, 20

会把 a[3] 设置为 20,而不会影响到 a[4] 。 这是因为 a[i] 中的 i 在被赋值为 4 之前就被拿出来了(那时是 3 )。 简单说 ,这样一行

     x, y = y, x

可以用来交换 xy 中的值。

对全局变量以及 table 中的域的赋值操作的含义可以通过 metatable 来改变。 对变量下标指向的赋值,即 t[i] = val 等价于 settable_event(t,i,val)。 (关于函数 settable_event 的详细说明,参见 §2.8。 这个函数并没有在 Lua 中定义出来,也不可以被调用。 这里我们列出来,仅仅出于方便解释的目的)

对于全局变量的赋值 x = val 等价于 _env.x = val,这个又可以等价于

     settable_event(_env, "x", val)

这里,_env 指的是正在运行中的函数的环境。 (变量 _env 并没有在 Lua 中定义出来。 我们仅仅出于解释的目的在这里写出来。)