当我在Lua函数参数中调用unpack()时发生了什么?

6

这是我所看到的:

> function test(...)
>>  for i, v in ipairs({...}) do
>>    print(v)
>>  end
>>end

-- This is expected
> test(unpack({1,2}))
1
2
-- When I mix unpack and regular arguments
-- What happened to 2?
> test(unpack({1,2}), 3)
1
3
-- What happened to 3?
> test(unpack({}), 3)

-- When I put regular args before unpack, everything is fine:
> test(1, unpack({2, 3}))
1
2
3

当我将未打包的参数与常规参数混合使用时,结果很奇怪。你能解释一下发生了什么吗?

这个回答解决了你的问题吗?Lua unpack() messing arguments - user202729
2个回答

5

请参阅Lua手册中的解释:

如果将表达式用作表达式列表的最后一个(或仅有的)元素,则不会进行调整(除非该表达式包含在括号中)。 在所有其他上下文中,Lua将结果列表调整为一个元素,要么丢弃所有值,只保留第一个值。

你得到的正是这个。Unpack()返回多个值,并将返回的元素列表调整为1个元素,除非它是test()参数中的最后一个表达式。


4
我将引用Lua参考文档中的内容:
函数调用和变长参数表达式都可以返回多个值。如果一个表达式被用作语句(仅在函数调用时可能发生(见§2.4.6)),那么它的返回列表会被调整为零个元素,因此丢弃所有返回值。如果一个表达式被用作表达式列表中的最后一个(或唯一一个)元素,则不会进行任何调整(除非该调用被括在括号中)。在所有其他上下文中,Lua会将结果列表调整为一个元素,丢弃除第一个元素以外的所有值。
正如你所看到的,由于你的unpack调用既不是表达式列表中的最后一个元素,也不是唯一的表达式,因此其返回值被减少为一个:
test(unpack({1,2}), 3)

在另一种情况下,答案非常简单:
test(unpack({}), 3)

test函数传入的第一个值为nil。因此,for i, v in ipairs({...}) do end不会执行任何操作,因为你的表的第一个值是nil,而unpack({})返回nil

ipairs (t)

Returns three values (an iterator function, the table t, and 0) so that the construction

 for i,v in ipairs(t) do body end

will iterate over the key–value pairs (1,t[1]), (2,t[2]), ..., up to the first nil value.


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