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
相关推荐
tianyu23429 分钟前
Java 正则表达式终极指南:从 Pattern 到 Matcher,从双重转义到性能优化,一篇全搞定
java·开发语言·正则表达式·group·find·pattern·matcher
caimouse2 小时前
ReactOS 窗口系统分析(23):键盘 — keyboard.c + kbdlayout.c
c语言·开发语言·计算机外设
Emily156853598703 小时前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
就叫_这个吧7 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡8 小时前
AI 应用系统设计
java·开发语言·人工智能
今天AI了吗9 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL52110 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing10 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习10 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
动词ing11 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构