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
相关推荐
青柠之夏cc18 分钟前
前端拖拽功能原生实现,不引入拖拽库完成业务
开发语言·前端·python
ym hyd 11124 分钟前
题库建立与考试系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·vue.js·spring boot·毕设
OKkankan30 分钟前
Python 高阶语法(一):高阶函数、闭包、lambda 与 functools——从底层真正理解装饰器
开发语言·python
geovindu37 分钟前
rust: Facade Pattern
开发语言·后端·设计模式·rust·外观模式
福大大架构师每日一题1 小时前
Rust 1.99.0发布:C 可变参数、裸函数、Cargo 配置、Rustdoc 性能与大量兼容性调整全解析
c语言·开发语言·rust
智鸟科技GemeOpen开发者智能设备1 小时前
平安校园 AI 智能实时告警系统 智鸟科技·GemeOpen + 谷华科技·融合创新方案白皮书
java·开发语言·python·物联网·智能家居
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: Feign 的自定义配置与日志级别
java·开发语言·spring cloud
成旭先生1 小时前
企业全景信息查询 API:工商照面 33 项、股东出资、变更与社保一次查全
java·开发语言·api接口·企业信息查询·工商数据·风控尽调·供应商准入
2601_962885721 小时前
批量取数比循环单取快多少?用 AlphaFeed klines.batch给多股票取数提速
开发语言·php·batch
动词ing1 小时前
【C语言题目练习】算法 整数反转
c语言·开发语言·算法