Lua:将多个结果从函数传递给表构造函数

pas*_*off 0 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
Run Code Online (Sandbox Code Playgroud)

此代码的结果是:

1   a
2   x
3   y
Run Code Online (Sandbox Code Playgroud)

因此,foo()除第一个元素外,所有结果都被丢弃.问题是,为什么有些元素被丢弃了?我已经简要检查了lua 5.2手册,但我没有看到这种行为的解释.

Nic*_*las 7

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

因为这就是Lua的工作方式.导致多个值(函数调用和...)的表达式,当在事物列表(例如表构造函数或函数调用参数列表)的上下文中使用时,只会将它们的所有值添加到该列表中(如果它是最后一个)列表的元素.

所以:

{foo, ...}
Run Code Online (Sandbox Code Playgroud)

将所有的varargs放在最后.

{..., foo}
Run Code Online (Sandbox Code Playgroud)

只会将第一个varargs放入表中.

如果要捆绑多个这样的函数调用,则必须使用一个函数将table.insert每个元素单独放入列表中.

  • 是的,有非常重要的目的.函数可以返回任意数量的结果,并且可以在不同的调用上返回不同数量的结果.这用于标记错误条件 - 如果出现错误,您只需返回*nil*,*errorString*.想象一下,你想在多个文件名上调用`io.open` - 你可以期望每个元素都是*nil*或文件句柄.如果多个结果确实展开,则必须处理突然出现在数组中的错误字符串的特殊情况.此外,在编译时无法知道返回值的数量. (3认同)
  • 多么不方便啊。我希望,以如此不直观的方式创建这部分语言是有重要目的的。无论如何,感谢您的快速答复。现在我知道我没有犯一些愚蠢的小错误。 (2认同)