变元论证
效率
vararg 列表在语言的 PUC-Rio 实现中实现为链表,这意味着索引是 O(n)
。这意味着使用 select()
迭代 vararg 中的元素,如下例所示,是 O(n ^ 2)操作。
for i = 1, select('#', ...) do
print(select(i, ...))
end
如果你计划迭代 vararg 列表中的元素,请先将列表打包到表中。表访问是 O(1)
,因此迭代总共为 O(n)
。或者,如果你如此倾向,请参阅高级用法部分中的 foldr()
示例; 它使用递归迭代 O(n)
中的 vararg 列表。
序列长度定义
vararg 很有用,因为 vararg 的长度尊重任何明确传递(或计算)的 nils。例如。
function test(...)
return select('#', ...)
end
test() --> 0
test(nil, 1, nil) --> 3
这种行为与表的行为相冲突,但是长度运算符 #
不能与序列中的 holes
(嵌入的 nils)一起使用。计算带孔的表的长度是未定义的,不能依赖。因此,根据 ...
中的值,取 {...}
的长度可能不会产生 正确的答案。在 Lua 5.2+中引入 table.pack()
来处理这个缺陷(在示例中有一个函数在纯 Lua 中实现这个功能)。
惯用法
因为 varargs 随身携带它们,所以人们将它们用作序列以避免表中的漏洞问题。这不是他们的预期用法,Lua 的参考实现没有优化。尽管在实施例中探讨了这种用法,但通常不赞成。