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

>doc