在lua中从函数返回多个值

23

我正在尝试以下的lua代码:

function test() return 1, 2 end
function test2() return test() end
function test3() return test(), 3 end

print(test()) -- prints 1 2
print(test2()) -- prints 1 2
print(test3()) -- prints 1 3

我希望test3返回1、2、3,如何最好地实现这个功能?


1
阅读Lua中有关多返回值的信息:http://www.lua.org/manual/5.2/manual.html#3.4 - Alex
这个链接将带您进入Lua-wiki页面,详细解释了您的问题。https://www.lua.org/pil/5.1.html Lua被编程为仅在与另一个值一起返回时返回test()的第一个值。 - GreenHawk1220
3个回答

32

如果你不确定某个函数可能返回多少个值,你可以像这样做。

function test() return 1, 2 end
function test2() return test() end
function test3()
    local values = {test2()}
    table.insert(values, 3)
    return unpack(values)
end


print(test3())
这将输出:
1   2   3

如果我想要 return test(), test() - 我会得到 1 1 2。可能我需要用 { } 捕获每个“元组”,然后在这里连接它们,而不是“合并”。(*) - 参见 https://dev59.com/LXM_5IYBdhLWcg3wWR2V vs https://dev59.com/A3M_5IYBdhLWcg3wp1Cl - Tomasz Gandor
是的,return test(), test() 只是 OP 中 return test(), 3 示例的稍微不同的变体。比我更好的解释在 这个 Lua 编程文档 上。 - Mike Corcoran
我可以将unpack的结果用作另一个函数的参数吗?如果可以,语法是什么? - VimNing

16
...
function test3()
    local var1, var2 = test()
    return var1, var2, 3
end

print(test3())

2
在这种情况下,最好使用表格。具有未知数量的返回值将很快变得非常麻烦。如果您使用表格,您可以在函数之外简单地解包它:print(table.unpack(testN()),其中testN返回一些未知数量的返回值,将打印所有返回值! - T Suds
你应该在返回 var1、var2、3 的末尾删除 end 吗?这会产生语法错误。 - Izzy

5

我还发现,在列表末尾调用函数时,返回值不会被截断。如果参数顺序无关紧要,则此方法效果很好。

function test() return 1, 2 end
function test2() return test() end
function test3() return 3, test() end

print(test()) -- prints 1 2
print(test2()) -- prints 1 2
print(test3()) -- prints 3 1 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接