当前位置: 首页 > news >正文

Lua 中的 table 类型详解

Lua 中的 table 类型详解

table 是 Lua 中唯一的数据结构机制,它实现了关联数组的功能,可以用来表示普通数组、序列、符号表、集合、记录、图、树等几乎所有数据结构。

基本特性

  1. table 是 Lua 中唯一的数据结构类型
  2. 可以包含任意类型的值(nil 除外)
  3. 可以通过任意类型的值(nil 除外)作为键
  4. 大小不固定,可以动态增长

创建 table

-- 创建一个空表
local t1 = {}

-- 创建并初始化数组部分
local t2 = {10, 20, 30}  -- 相当于 {[1]=10, [2]=20, [3]=30}

-- 创建并初始化键值对
local t3 = {name="Lua", version="5.4"}

访问 table 元素

local t = {name="Lua", age=28}

-- 点语法访问
print(t.name)  -- 输出 "Lua"

-- 索引语法访问
print(t["name"])  -- 输出 "Lua"

-- 数组部分访问
local arr = {10, 20, 30}
print(arr[1])  -- 输出 10 (注意 Lua 数组索引默认从1开始)

修改 table

local t = {}

-- 添加/修改元素
t["key"] = "value"
t.key2 = "value2"
t[1] = "first element"

-- 删除元素
t.key = nil

遍历 table

local t = {a=1, b=2, c=3}

-- pairs 遍历所有键值对
for k, v in pairs(t) do
    print(k, v)
end

-- ipairs 遍历数组部分(从1开始的连续整数索引)
local arr = {10, 20, 30}
for i, v in ipairs(arr) do
    print(i, v)
end

常用 table 操作

Lua 提供了 table 标准库来处理 table:

local t = {3, 1, 4, 2}

-- 插入元素
table.insert(t, 5)       -- 在末尾插入
table.insert(t, 2, 1.5)  -- 在位置2插入

-- 移除元素
table.remove(t, 3)       -- 移除位置3的元素

-- 排序
table.sort(t)            -- 升序排序
table.sort(t, function(a, b) return a > b end)  -- 降序排序

-- 连接
local s = table.concat(t, ", ")  -- 用", "连接所有元素

多维 table

-- 创建二维数组
local matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
}

print(matrix[2][3])  -- 输出 6

-- 创建混合结构
local person = {
    name = "Alice",
    age = 25,
    hobbies = {"reading", "swimming", "coding"},
    address = {
        city = "Beijing",
        street = "Main St"
    }
}

元表 (Metatable)

元表可以改变 table 的行为:

local t1 = {a = 1}
local t2 = {b = 2}

-- 设置元表
local mt = {
    __add = function(t1, t2)
        local result = {}
        for k, v in pairs(t1) do result[k] = v end
        for k, v in pairs(t2) do result[k] = v end
        return result
    end
}

setmetatable(t1, mt)
setmetatable(t2, mt)

local t3 = t1 + t2  -- 使用元方法 __add
print(t3.a, t3.b)   -- 输出 1, 2

注意事项

  1. Lua 的 table 默认使用 1 作为数组的起始索引
  2. table 是引用类型,赋值和传参都是传递引用
  3. 使用 # 运算符可以获取数组部分的长度(连续整数索引部分)
  4. nil 值会中断数组部分,# 可能不会返回预期结果

table 是 Lua 中最重要、最灵活的数据结构,几乎所有的 Lua 程序都会大量使用 table。

相关文章:

  • 深入解析 HTML 中 `<script>` 标签的 async 和 defer 属性
  • 高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案
  • autogenstudio设置
  • Redisson的红锁,分段锁,公平锁,联锁。。。。。。
  • 信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷
  • 高负载WEB服务器--Tomcat
  • 深入理解 v-show 指令及其使用方法
  • 【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案
  • github进阶使用教程
  • .net执行脚本:通过字符串的形式来执行按钮的点击操作
  • 【Python实时数据处理】流式计算与异步编程实战
  • 微服务之protobuf:下载、语法和使用一站式教程
  • Linux文件传输:让数据飞起来!
  • vue2项目集成Tailwindcss
  • 6.1 GitHub亿级数据采集实战:双通道架构+三级容灾设计,破解API限制与反爬难题
  • 青少年编程与数学 02-016 Python数据结构与算法 18课题、组合数学算法
  • Ubuntu 安装 Cursor AppImage 到应用程序中
  • n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)
  • linux 如何查看mac地址?喂饭版
  • STM32 HAL库 OLED驱动实现
  • 国家主席习近平同普京总统签署关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 见微知沪|优化营商环境,上海为何要当“细节控”自我加压?
  • 招行:拟出资150亿元全资发起设立金融资产投资公司
  • 现场丨“影像上海”启幕:串联摄影、电影与当代艺术
  • 泉州一家婚介机构广告牌越南新娘七天闪婚领证?市监部门介入
  • 从“重规模”向“重回报”转变,公募基金迎系统性改革