赋值

Lua 允许进行多重赋值。因此,赋值语法在左侧定义一列变量,在右边定义一列表达式。两个列表中的元素均以逗号分隔:

stat ::= varlist `=´ explist
varlist ::= var {`,´ var}
explist ::= exp {`,´ exp}

表达式在表达式中讨论。

在赋值之前,值列表会调整为变量列表长度。值超过所需的数目时,将会丢弃多余的值。如果值少于所需的数目,那么会根据需要,以任意数目的 null 扩展列表。如果表达式列表以函数调用结尾,那么该调用所返回的所有值都会在调整前进入值列表(除非将该调用括在圆括号内;请参阅表达式)。

赋值语句先对其所有表达式进行求值,然后才执行赋值。因此,以下代码:

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

会将 a[3] 设置为 20,而不会影响 a[4],因为 a[i] 中的 i 会在获赋值 4 之前求值为 3。同样,以下代码行:

     x, y = y, x

交换 xy 的值,而以下代码行:

     x, y, z = y, z, x

循环交换 xyz 的值。

对全局变量 x = val 的赋值等同于赋值 _env.x = val,其中 _env 是运行中的函数的环境。(_env 变量在 Lua 中未定义。在这里使用这个变量只是为了进行说明。)