lua 的表达式有一些特殊情况。
1. 被括号包起来的表达式永远被当成一个值[1]
(f(x,y,z)),即使 f 返回多个值,这个表达式永远是单个值。
2. 多返回值的调整[1]
函数调用和变长参数表达式都会产生多个值,这些表达式被称为多返回值表达式(multires expressions)。
根据多返回值表达式所处的位置,有两条规则:
-
规则一:当多返回值表达式(multires expressions)被放在表达式列表(a list of expressions)的末尾时,此多返回值表达式的所有值会被加入此表达式列表的值列表中。
-
规则二:当多返回值表达式被用于表达式列表但却没有出现在末尾时,此多返回值表达只有第一个值会被加入此表达式列表的值列表中。
以下是一些例子:
-
local x, y, z = 10, f()
, x 取得 10,y 取得 f() 的第一个返回值,z 取得 f() 的第二个返回值。(规则一) -
local x, y, z = f(), 10
, x 取得 f() 的第一个返回值,y 取得 10,z 取得 nil。(规则二) -
local x, y, z = f(), g()
,x 取得 f() 的第一个返回值,y 取得 g() 的第一个返回值,z 取得 g() 的第二个返回值。(f 是规则一,g 是规则二) -
{f(), 10}
,由 f() 的第一个返回值和 10 构成的数组。(规则一) -
{10, f()}
,由 10 和 f() 的所有返回值构成的数组。(规则二)
3. 参考
[1] lua. Lists of expressions, multiple results, and adjustment. Available at https://lua.org/manual/5.4/manual.html#3.4.3.