此代码:
function foo()
return 1, 2, 3
end
bar = {}
bar = {a, b, c = foo()}
产生:
bar.a = nil
bar.b = nil
bar.c = 1
如何编写,以便您获得:
bar.a = 1
bar.b = 2
bar.c = 3
无需写这样的东西:
function foo()
return 1, 2, 3
end
bar = {}
a, b, c = foo()
bar = {a = a, b = b, c = c}
没有直接或优雅的方法可以做到这一点。您必须像这样手动进行]
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() }
[此table constructor expression将被解释为将键a
,b
,c
插入表中,只有最后一个具有关联值的键(此外:没有关联值的键被视为[ C0];因此nil
和a
永远不会插入)。由于只有一个变量可以使用b
返回的值,因此除了第一个返回的所有其他内容外,其他所有变量都将被丢弃。
或者foo
会将bar = { foo() }
返回的所有值分配为foo
的数组值。但是,访问这些键的键将是bar
,[1]
等,而不是[2]
,'a'
等
阅读下面的内容了解何时返回的值将被丢弃,何时不将其丢弃。
TL; DR仅当函数调用是表达式列表中的最后一个/唯一表达式时,才保留所有返回的值。其他地方,除第一个以外的所有地方都被丢弃。
在Lua中,当我们从一个函数返回多个结果时,如果该函数调用本身是一条语句,则所有这些结果都将被丢弃。
'b'
将丢弃所有三个返回值。
如果在表达式中使用,则仅保留第一个,而所有其他内容将被丢弃。
foo()
仅当调用在表达式列表中显示为最后/唯一项时,才保留返回的整个值列表。这样的表达式列表出现在Lua的四个地方:
多次分配
例如x = foo() - 1
print(x) -- prints 0; the values 2, 3 are discarded
。在此local a, b, c, d = 0, f()
,b
,c
分别获得值d
,1
,2
。
表构造函数
例如3
。 local t = { 0, f() }
返回的所有值都放在第一个f
之后的t
中。
函数调用参数
例如0
。 g(a, f())
将收到4个参数,而不是2个参数。 g
和a
中的三个值。
[f
语句
例如return
。除字符串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
bar = {}
bar.a, bar.b, bar.c = foo()
[简单地,bar = {}
local abc = foo()
bar.a, bar.b, bar.c = abc, abc, abc
只会将bar.a, bar.b, bar.c = foo()
设置为bar.a
,其他两个将被设置为foo()
,因为它们分别设置为第二个和第三个值,而您只给出了一个值。
如果可以,让foo()返回正确格式的表。
nil