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