BLUF
没有直接或优雅的方法来做到这一点。你必须像这样手动完成
local r = { f() } --> store all returned values in r
local bar = { }
local c = string.byte 'a' --> start with 'a'
for _, v in ipairs(r) do
local t = string.char(c)
bar[t] = v --> assign each value to respective letter
c = c + 1
end
如果你有过a, b, c = foo()
您将获得分配给三个变量的所有三个值。然而,你已经
bar = { a, b, c = foo() }
This 表构造函数表达式将被解释为键a
, b
, c
插入到表中,只有最后一个键具有关联值(旁白:没有关联值的键被视为nil
; hence a
and b
永远不会被插入)。由于只有一个变量可以获取返回的值foo
,除了第一个,它返回的其他所有内容都被丢弃。
或者bar = { foo() }
将分配返回的所有值foo
作为数组值bar
。然而,访问这些的关键是[1]
, [2]
等,而不是'a'
, 'b'
, etc.
请阅读下文以了解返回值何时被丢弃以及何时不被丢弃。
TL;DR仅当函数调用是表达式列表中的最后一个/唯一的表达式时,才会保留所有返回值;在其他地方,除了第一个之外的所有内容都被丢弃。
作为语句的函数调用
在Lua中,当我们从一个函数返回多个结果时,如果函数调用本身就是一条语句,那么所有结果都会被丢弃。
foo()
将丢弃所有三个返回值。
表达式中的函数调用
如果在表达式中使用它,则仅保留第一个,其他所有内容都将被丢弃。
x = foo() - 1
print(x) -- prints 0; the values 2, 3 are discarded
表达式列表中的函数调用
仅当调用作为表达式列表中的最后/唯一项出现时,才会保留返回值的整个列表。这样的表达式列表出现在 Lua 中的四个地方:
-
多重作业
E.g. local a, b, c, d = 0, f()
. Here b
, c
, d
获取值1
, 2
, 3
分别。
-
表构造函数
E.g. local t = { 0, f() }
。返回的所有值f
被放入t
继第一个之后0
.
-
函数调用参数
E.g. g(a, f())
. g
将收到 4 个而不是 2 个参数。a
和三个值f
.
-
return
陈述
E.g. return 'a', f()
。附加到字符串'a'
,返回的所有值f
将在主叫端收到。
在所有这些情况下,f
不是列表中的最后一个表达式,也不是唯一的表达式,那么它返回的所有值(第一个值除外)都将被丢弃。
多重赋值语句
在多重赋值语句中,当赋值的个数少于变量个数时,将多余的变量赋值给nil
。当情况相反时,即如果变量数量较少,则多余的值将被丢弃。
a, b, c = 1, 2 -- a = 1, b = 2, c = nil
a, b, c = 1, 2, 3, 4 -- 4 gets discarded