当前位置: 首页 > 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。

http://www.dtcms.com/a/131187.html

相关文章:

  • 深入解析 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驱动实现
  • Go语言中的runtime包是用来做什么的?
  • 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二)
  • Linux实现翻译以及群通信功能
  • 深度学习与力学建模融合的骨力学性能研究
  • 二叉树-算法小结
  • MATLAB双目标定
  • 零基础HTML·笔记(持续更新…)
  • 生成式AI与RAG架构:如何选择合适的向量数据库?
  • 山东大学软件学院创新项目实训(11)之springboot+vue项目接入deepseekAPI
  • c++STL——string学习的模拟实现