Lua Table库

本文介绍了Lua中的table库,包括使用#操作符获取array大小、table.insert和table.remove进行元素插入和删除,以及table.sort进行排序。特别提到了Lua5.4对getn/setn机制的淘汰,以及处理table作为dictionary时的排序问题和解决方案。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值