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
相关推荐
进阶小白猿5 小时前
Java技术八股学习Day33
java·开发语言·学习
执风挽^6 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
Z9fish6 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
萧鼎7 小时前
Python 包管理的“超音速”革命:全面上手 uv 工具链
开发语言·python·uv
Anastasiozzzz7 小时前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步7 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机8 小时前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经8 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
R_.L8 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan8 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络