变元论证

效率

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 的参考实现没有优化。尽管在实施例中探讨了这种用法,但通常不赞成。