Help:Lua/table

出自滚动的天空Wiki

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也會投擲錯誤。

該函數會修改表自身,不會返回值。

排序演算法並不穩定;也就是說,當兩個元素按照給定的順序被看作相等時,它們在排序後的相對位置可能會改變。

不推薦使用的函數[編輯原始碼]

foreachforeachigetn

暫不受支援的函數[編輯原始碼]

movepack

unpack位於標準庫,應直接使用unpack(t)而非table.unpack(t),參見Help:Lua/基本#unpack