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。