这是我看到的:
> 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
当我将解压缩的参数与常规args混合时,结果很奇怪。您能解释一下幕后发生的事情吗?
我将引用Lua参考:
函数调用和vararg表达式都可以产生多个值。如果将表达式用作语句(仅可用于函数调用(请参见第2.4.6节)),则将其返回列表调整为零个元素,从而丢弃所有返回的值。如果将表达式用作表达式列表的最后一个(或唯一)元素,则不会进行任何调整(除非调用包含在括号中)。在所有其他情况下,Lua会将结果列表调整为一个元素,并丢弃除第一个元素外的所有值。
如您所见,解压缩调用减少为一个返回值,因为它既不是传递给测试的表达式列表中的最后一个表达式,也不是唯一的表达式:
test(unpack({1,2}), 3)
在另一种情况下,答案很简单:
test(unpack({}), 3)
传递给测试的第一个值为nil。为此for i, v in ipairs({...}) do end
会做什么作为你的表的第一个值nil
作为unpack({})
回报nil
一对(t)
返回三个值(迭代器函数,表t和0),以便构造
for i,v in ipairs(t) do body end
将遍历键-值对(1,t [1]),(2,t [2]),...,直到第一个nil值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句