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
可以用来交换 x
和 y
中的值。
对全局变量以及 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 中定义出来。
我们仅仅出于解释的目的在这里写出来。)