變元論證

效率

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 的參考實現沒有優化。儘管在實施例中探討了這種用法,但通常不贊成。