元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Lua语言基础
▶
环境搭建
安装Lua解释器
配置开发环境
第一个Lua程序
▶
基本语法
变量与数据类型
运算符与表达式
控制结构
▶
数据结构
表(Table)详解
数组与迭代
字符串处理
▶
Lua高级编程
▶
函数编程
函数定义与调用
闭包与作用域
高阶函数应用
▶
元表与元方法
元表基础
操作符重载
继承与对象系统
▶
协程编程
协程基础
生产者-消费者模式
协程调度实践
▶
Lua应用实践
▶
游戏开发
Lua与游戏引擎集成
AI脚本实现
热更新机制
▶
系统编程
Lua与C交互
扩展库开发
性能优化技巧
▶
实用工具开发
配置文件解析
自动化测试框架
网络编程基础
发布时间:
2025-03-24 12:03
↑
☰
# Lua表(Table)详解 本文将详细介绍Lua中最重要的数据结构——表(Table),帮助你理解如何使用这个强大而灵活的数据类型。 ## 表的基本概念 表(Table)是Lua中唯一的数据结构,它可以用来实现数组、字典、集合、对象等多种数据结构: - 表是动态的,可以根据需要增长 - 表可以存储任何非nil的值 - 表是引用类型,通过引用来传递和赋值 - 表可以作为其他表的字段 ## 表的创建和访问 ### 1. 创建表 ```lua -- 创建空表 local t1 = {} -- 创建数组型表 local array = {10, 20, 30, 40, 50} -- 创建字典型表 local dict = { name = "张三", age = 25, isStudent = true } -- 创建混合型表 local mixed = { 100, -- 数组部分 200, name = "混合表", -- 字典部分 ["key"] = "value", [1.5] = "浮点数键", [{}] = "表作为键" -- 使用表作为键 } ``` ### 2. 访问表元素 ```lua -- 使用索引访问(数组风格) local first = array[1] -- Lua的索引从1开始 local second = array[2] -- 使用点号访问(对象风格) local name = dict.name local age = dict.age -- 使用方括号访问(字典风格) local value = dict["name"] local age = dict["age"] -- 访问不存在的键 local notExist = dict.notExist -- 返回nil ``` ## 表的常用操作 ### 1. 插入和删除 ```lua -- 向数组尾部插入元素 local arr = {1, 2, 3} table.insert(arr, 4) -- {1, 2, 3, 4} -- 在指定位置插入元素 table.insert(arr, 2, 10) -- {1, 10, 2, 3, 4} -- 删除数组末尾的元素 local last = table.remove(arr) -- 返回被删除的元素 -- 删除指定位置的元素 local removed = table.remove(arr, 2) -- 删除第2个元素 ``` ### 2. 表的长度 ```lua -- 获取数组长度 local arr = {10, 20, 30, 40} print(#arr) -- 输出:4 -- 注意:长度操作符只对数组部分有效 local mixed = {10, 20, key = "value"} print(#mixed) -- 输出:2(只计算数组部分) -- 获取实际元素数量 local count = 0 for _ in pairs(mixed) do count = count + 1 end print(count) -- 输出:3(包含所有键值对) ``` ### 3. 表的遍历 ```lua -- 遍历数组(使用ipairs) local arr = {10, 20, 30} for i, v in ipairs(arr) do print(i .. ": " .. v) end -- 遍历所有键值对(使用pairs) local dict = {name = "李四", age = 30} for k, v in pairs(dict) do print(k .. ": " .. tostring(v)) end -- 遍历指定范围 for i = 1, #arr do print(arr[i]) end ``` ## 表的高级特性 ### 1. 表作为函数参数 ```lua -- 传递表给函数 local function printPerson(person) print(string.format( "%s今年%d岁", person.name, person.age )) end local person = {name = "王五", age = 35} printPerson(person) ``` ### 2. 表作为命名参数 ```lua -- 使用表实现命名参数 local function createPerson(params) return { name = params.name or "匿名", age = params.age or 0, gender = params.gender or "未知" } end local p = createPerson({ name = "赵六", age = 28, gender = "男" }) ``` ### 3. 表的嵌套 ```lua -- 嵌套表 local school = { name = "第一中学", students = { { name = "张三", scores = {chinese = 85, math = 90, english = 88} }, { name = "李四", scores = {chinese = 92, math = 85, english = 90} } } } -- 访问嵌套表 print(school.students[1].name) -- 输出:张三 print(school.students[1].scores.chinese) -- 输出:85 ``` ### 4. 表的拷贝 ```lua -- 浅拷贝函数 local function shallowCopy(t) local copy = {} for k, v in pairs(t) do copy[k] = v end return copy end -- 深拷贝函数 local function deepCopy(t) if type(t) ~= "table" then return t end local copy = {} for k, v in pairs(t) do copy[k] = type(v) == "table" and deepCopy(v) or v end return copy end -- 使用示例 local original = {a = 1, b = {x = 10, y = 20}} local shallow = shallowCopy(original) local deep = deepCopy(original) ``` ## 常见问题解答 ### Q1: 为什么Lua的数组索引从1开始? 这是Lua的设计选择,主要考虑: - 符合数学和自然语言习惯 - 与Lua的字符串操作保持一致 - 在某些应用场景下更方便 ### Q2: pairs和ipairs的区别是什么? - `pairs`:遍历表中的所有键值对,包括非数字键 - `ipairs`:只遍历数组部分(连续的数字键,从1开始) ```lua local t = {10, 20, name = "test", 30} -- pairs遍历所有元素 for k, v in pairs(t) do print(k, v) end -- ipairs只遍历数组部分 for i, v in ipairs(t) do print(i, v) end ``` ### Q3: 如何判断表是否为空? ```lua -- 方法1:使用next函数 local function isEmpty(t) return next(t) == nil end -- 方法2:遍历计数 local function getSize(t) local count = 0 for _ in pairs(t) do count = count + 1 end return count end ``` ## 下一步 现在你已经掌握了Lua表的基本用法,可以继续学习[数组与迭代](/article/lua/basic/arrays)来深入了解如何更好地使用表来处理数组数据。 ## 参考资源 - [Lua 5.4 参考手册](http://www.lua.org/manual/5.4/manual.html#2.5) - [Programming in Lua](http://www.lua.org/pil/2.5.html) - [Lua Tables Tutorial](http://lua-users.org/wiki/TablesTutorial)