Lua Table库

table 库由一些操作 table 的辅助函数组成。他的主要作用之一是对 Lua 中 array 的大小给出一个合理的解释。另外还提供了一些从 list 中插入删除元素的函数,以及对 array 元素排序函数。

数组大小#

在programming in lua中教我们使用getn/setn来实现对array大小的读取与控制。但遗憾的是Lua5.4已经淘汰了这个机制,原因很简单,其只是去操作了表的n的域,如若表内控制了n的数值,那么将会有巨大灾难,这在原书中也有提及过,只不过比较轻描淡写:

Lua 复制代码
a = {n=10} 
print(table.getn(a)) --> 10

目前改成了#修饰符作为array的大小读取操作会相对安全很多:

Lua 复制代码
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来使用,那么是失效的,比如官方文档举的例子:

Lua 复制代码
lines = { 
    luaH_set = 10, 
    luaH_get = 24, 
    luaH_present = 48, 
} 

原因是这在表内部是以键值对存储的,通过pairs来遍历这张表格时实际上顺序是随机的。但我们可以另辟蹊径,实现pairsByMySelf函数,来完成排序后的迭代操作:

Lua 复制代码
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
相关推荐
我有火的意志7 分钟前
Liunx执行source /etc/profile 报错, -bash: HISTTIMEFORMAT: readonly variable
开发语言·bash·histtimeformat·readonly
蒋星熠25 分钟前
中间件架构设计与实践:构建高性能分布式系统的核心基石
开发语言·数据库·分布式·python·中间件·性能优化·硬件工程
枫叶丹426 分钟前
【Qt开发】显示类控件(二)-> QLCDNumber
开发语言·qt
励志不掉头发的内向程序员1 小时前
STL库——AVL树
开发语言·c++·学习
晨非辰3 小时前
#C语言——刷题攻略:牛客编程入门训练(十一):攻克 循环控制(三),轻松拿捏!
c语言·开发语言·经验分享·学习·visual studio
励志码农5 小时前
JavaWeb 30 天入门:第二十三天 —— 监听器(Listener)
java·开发语言·spring boot·学习·servlet
天高云淡ylz5 小时前
子网掩码的隐形陷阱:为何能ping通却无法HTTPS访问
开发语言·php
希望20177 小时前
Golang Panic & Throw & Map/Channel 并发笔记
开发语言·golang
朗迹 - 张伟7 小时前
Golang安装笔记
开发语言·笔记·golang
yzx9910137 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化