Help:Lua/table
table庫包含了Lua內置的一些用於處理數組的函數。對於更高級的表處理,請參考Module:TableTools。
這些庫的函數不會受到元表影響,因此對於框架對象的args
表,以及mw.loadData
返回的表,該庫的函數可能不會生效。
concat[編輯原始碼]
用法:table.concat(t, sep, i, j)
將數組t的所有元素連接起來。如果指定了字符串sep,則用sep連接,否則直接連接,相當於sep為空字符串。
i的默認值為1,j的默認值為#t。返回的字符串相當於t[i] .. sep .. t[i+1] .. sep .. t[j]
。
如果數組中遇到除了數字和字符串之外的元素,該函數會拋出錯誤,因為其他類型的元素無法進行連接(即使元表指定了__concat元方法)。特別地,對於稀疏數組,該函數有可能會成功,也有可能會失敗,因為稀疏數組的「洞」有可能會視為數組界限之外而被忽略,也有可能因為視為數組的一部分而拋出無法連接的錯誤,
連接大量字符串時應當使用table.concat而不是直接連接,因為字符串每連接一次,都會產生一個新的字符串對象,並將舊的對象作為垃圾回收。而table.concat只會一次性生成一個新的字符串對象。
如需使得最後一項與倒數第二項的連接方式特殊,比如產生「1、2、3和4」這樣的字符串,可以使用mw.text.listToText。
insert[編輯原始碼]
用法:table.insert(t, value)
,table.insert(t, pos, value)
在表table的位置pos處插入元素value,會將其他元素的位置增加1以給這個元素提供插入空間。pos的默認值為表的長度加1,所以調用table.insert(t, x)會在表t的末尾插入x。
在數組t的位置pos處插入元素value,後面的元素都會被往後挪一位。pos默認值為#t+1,也就是說,如果不指定pos,會將元素插在數組的最後面。需要注意:對於稀疏數組,該函數可能就會存在一些問題。
該函數會修改表自身,但不會將其返回。
注意:對於代碼性能密集的地方,如需多次插入元素在數組末尾,應當直接使用t[#t+1] = value
,這樣性能更好。
maxn[編輯原始碼]
用法:table.maxn(t)
返回表t的最大正數索引,或者表沒有正數索引時返回零。
會遍歷整個表,大致相當於:
function table.maxn(t)
local maxn, k = 0, nil
repeat
k = next(t, k)
if type(k) == 'number' and k > maxn then
maxn = k
end
until not k
return maxn
end
remove[編輯原始碼]
用法:table.remove(table, pos)
從數組t中移走位於pos處的元素,將後面的元素前移。pos的默認值#t,所以調用table.remove(t)會移除數組t的最後一個元素。
該函數會修改表自身,並返回被移出來的元素。
sort[編輯原始碼]
用法:table.sort(t, comp)
將數組t中的元素排序。如果指定了comp,則comp必須是能夠接收兩個表元素的函數,並且當第一個小於第二個時返回true(所以not comp(a[i+1], a[i])
會在排序後為true)。如果沒有給定comp,則使用標準的Lua操作符<,也就是說這種情況下如果遇到兩個不可比較的元素就會拋出錯誤。例如
local t = {1, 2, 3, 'a', 'b', 'c'}
table.sort(t)
是無效的,因為排序時會將數字與字符串比較,而數字與字符串是不能比較的,從而拋出錯誤。
此外,如果指定了函數comp,而comp在遇到兩個相同的參數時返回了true,則該函數視為無效函數,table.sort也會拋出錯誤。
該函數會修改表自身,不會返回值。
排序算法並不穩定;也就是說,當兩個元素按照給定的順序被看作相等時,它們在排序後的相對位置可能會改變。
不推薦使用的函數[編輯原始碼]
foreach
、foreachi
和getn
。
暫不受支持的函數[編輯原始碼]
move
和pack
。
另unpack
位於標準庫,應直接使用unpack(t)
而非table.unpack(t)
,參見Help:Lua/基本#unpack。