table 库由一些操作 table 的辅助函数组成。他的主要作用之一是对 Lua 中 array 的大小给出一个合理的解释。另外还提供了一些从 list 中插入删除元素的函数,以及对 array 元素排序函数。
数组大小#
在programming in lua中教我们使用getn/setn来实现对array大小的读取与控制。但遗憾的是Lua5.4已经淘汰了这个机制,原因很简单,其只是去操作了表的n的域,如若表内控制了n的数值,那么将会有巨大灾难,这在原书中也有提及过,只不过比较轻描淡写:
a = {n=10}
print(table.getn(a)) --> 10
目前改成了#修饰符作为array的大小读取操作会相对安全很多:
a = {n=10}
print(#a) --> 0
插入/删除
用table.insert(list, pos, value)完成table的插入操作,如果只是两个参数,则是table.insert(list, value),其会默认在list最末尾完成插入操作。只不过有疑惑的点在于它如何做到这种兼容的,大概率也是源码中有value==nil的判断来了解是第二个参数还是第三个参数作为value值的吧。
同样的,用table.remove(list, pos)完成table的删除操作,如若pos = nil,则默认在最末尾完成删除操作。
排序
用table.sort(list, comp)作为table的排序函数。其是一个高级函数,意味着comp本身是一个用作两个操作数的判断函数comp(a, b),返回true or false,作为a在b前面与否的条件。当然我们需要注意的是其只对list/array生效,如若表被用来当作dictionary/map来使用,那么是失效的,比如官方文档举的例子:
lines = {
luaH_set = 10,
luaH_get = 24,
luaH_present = 48,
}
原因是这在表内部是以键值对存储的,通过pairs来遍历这张表格时实际上顺序是随机的。但我们可以另辟蹊径,实现pairsByMySelf函数,来完成排序后的迭代操作:
function pairsByMySelf(tb)
local listKey = {}
for k,v in pairs(tb) do
table.insert(listKey,k)
end
table.sort(listKey)
local i = 0
return function()
i = i + 1
return listKey[i],tb[listKey[i]]
end
end
local lines = {
luaH_set = 10,
luaH_get = 24,
luaH_present = 48,
}
for k,v in pairsByMySelf(lines) do
print(k.." "..v)
--print:
--luaH_get 24
--luaH_present 48
--luaH_set 10
end