这段代码:
function foo()
return 1, 2, 3
end
bar = {}
bar = {a, b, c = foo()}
Run Code Online (Sandbox Code Playgroud)
生产:
bar.a = nil
bar.b = nil
bar.c = 1
Run Code Online (Sandbox Code Playgroud)
怎么写这样才能得到:
bar.a = 1
bar.b = 2
bar.c = 3
Run Code Online (Sandbox Code Playgroud)
无需写这样的东西:
function foo()
return 1, 2, 3
end
bar = {}
a, b, c = foo()
bar = {a = a, b = b, c = c}
Run Code Online (Sandbox Code Playgroud)
没有直接或优雅的方式来做到这一点.你必须像这样手动完成
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
Run Code Online (Sandbox Code Playgroud)
如果您已经a, b, c = foo()获得了分配给三个变量的所有三个值.但是,你已经
bar = { a, b, c = foo() }
Run Code Online (Sandbox Code Playgroud)
此表构造表达将得到解释为键a,b,c得到插入到表中,只有具有相关联的值的最后一个键(除了:用被作为没有关联的值的键nil;因此a和b永远不会插入).由于只有一个变量可以获取返回的值foo,除了它返回的其他所有内容都将被丢弃.
或者,bar = { foo() }将所有返回的值分配foo为数组值bar.然而,关键要访问这些会[1],[2]等等,不'a','b'等等.
请阅读下面的内容,了解何时丢弃返回的值以及何时不丢弃.
TL; DR 只有当函数调用是表达式列表中的最后一个/唯一表达式时,才会保留所有返回值.其他所有人除了第一个被丢弃.
在Lua中,当我们从函数返回多个结果时,如果函数调用本身就是一个语句,它们都会被丢弃.
foo()
Run Code Online (Sandbox Code Playgroud)
将丢弃所有三个返回值.
如果它在表达式中使用,则只保留第一个,其他所有内容都将被丢弃.
x = foo() - 1
print(x) -- prints 0; the values 2, 3 are discarded
Run Code Online (Sandbox Code Playgroud)
仅当调用显示为表达式列表中的最后/唯一项时,才会保留返回的整个值列表.这样的表达列表出现在Lua的四个地方:
多项任务
例如local a, b, c, d = 0, f().在这里b,c,d得到的值1,2,3分别.
表构造函数
例如local t = { 0, f() }.返回的所有值f都放在t第一个之后0.
函数调用参数
例如g(a, f()).g会得到4个而不是2个参数.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
Run Code Online (Sandbox Code Playgroud)