Lua:将函数的多个返回值传递给表构造函数

我发现了 Lua 的奇怪行为。代码示例:

function foo()
    local t = {'a', 'b', 'c'}
    return unpack(t)
end

function bar()
    local t = {'x', 'y'}
    return unpack(t)
end

b = { foo(), bar() }

for k,v in pairs(b) do
    print(k,v)
end

这个代码的结果是:

1   a
2   x
3   y

所以,foo() 的结果除了第一个元素外,都被丢弃了。问题是,为什么有些元素被丢弃了呢?我简要查看了 Lua 5.2 手册,但我没有看到对这种行为的解释。

点赞
用户734069
用户734069

问题是,为什么有些元素被舍弃了?

这是因为 Lua 的工作原理。 当使用多值结果表达式(例如函数调用和 ...)在列举多个元素的上下文中使用(例如表构造或函数调用参数列表)时,如果它是列表的_最后一个_元素,它将仅将所有值添加到该列表中。

所以:

{foo, ...}

将把所有可变参数放在最后。

{..., foo}

只会将可变参数的第一个元素放入表中。

如果要打包多个这样的函数调用,则必须使用一个函数,该函数将每个元素单独table.insert到列表中。

2013-01-06 20:34:31