Lua 数组
关键要点
- 研究表明,Lua 的数组是基于
table
实现的特殊数据结构,索引默认从 1 开始,适合存储有序数据。 - 证据显示,数组通过
table
的整数键访问,支持动态扩容,常用#
获取长度,ipairs
遍历元素。 - 看起来很可能是通过
table
库函数(如table.insert
、table.remove
)操作数组,结合local
变量优化性能。
Lua 数组简介
概述
在 Lua 中,数组(array)是使用 table
数据结构实现的特殊形式,用于存储有序的元素序列。Lua 的数组索引默认从 1 开始(而非 0),支持动态添加或删除元素,操作灵活。数组通过整数键访问,结合 table
库函数和循环实现高效的数据管理。本文详细讲解 Lua 数组的定义、操作、遍历、示例及注意事项,特别适合中文用户学习。
数组特性
- 实现:基于
table
,使用连续整数键存储元素。 - 索引:默认从 1 开始,可自定义。
- 长度:使用
#
运算符获取连续整数索引的元素数。 - 操作:通过
table.insert
、table.remove
等函数增删元素。 - 遍历:使用
ipairs
循环或数值型for
循环遍历。 - 动态性:支持动态扩容和收缩,无需预定义大小。
参考资源
详细调研报告
本文为用户提供关于 Lua 数组的全面中文讲解,涵盖数组定义、基本操作、遍历、表库函数、示例及注意事项,基于可靠的在线资源和官方文档。
Lua 数组概述
Lua 的数组是 table
的子集,使用连续整数键(通常从 1 开始)存储有序数据。研究表明,Lua 数组通过 table
的灵活性实现动态管理,结合 table
库函数和循环提供高效操作。以下是详细分析:
- 数组定义:
- 数组是
table
的特殊形式,元素以连续整数键存储。 - 语法:
lua local arr = {元素1, 元素2, 元素3}
- 示例:
lua local fruits = {"apple", "banana", "orange"} print(fruits[1]) -- 输出:apple print(type(fruits)) -- 输出:table print(#fruits) -- 输出:3(数组长度)
- 注意:
- 索引从 1 开始,与 C/C++ 等语言不同。
- 数组是
table
,可混用非整数键,但影响#
的行为。
- 基本操作:
- 访问元素:通过整数索引访问,如
arr[1]
。lua local arr = {10, 20, 30} print(arr[2]) -- 输出:20
- 修改元素:直接赋值修改。
lua arr[2] = 25 print(arr[2]) -- 输出:25
- 添加元素:
- 直接赋值到新索引:
lua arr[4] = 40 print(#arr) -- 输出:4
- 使用
table.insert
:lua table.insert(arr, 50) -- 添加到末尾 print(arr[5]) -- 输出:50
- 直接赋值到新索引:
- 删除元素:
- 赋值为
nil
(可能导致非连续索引):lua arr[2] = nil print(arr[2]) -- 输出:nil
- 使用
table.remove
:lua table.remove(arr, 1) -- 删除索引 1 的元素,后续元素前移 print(arr[1]) -- 输出:25(原 arr[2])
- 赋值为
- 长度:使用
#
获取连续整数索引的元素数。local arr = {1, 2, 3} print(#arr) -- 输出:3 arr[5] = 5 -- 非连续索引 print(#arr) -- 输出:3(# 只计数连续部分)
- 遍历数组:
- 数值型 for 循环:
lua local arr = {"a", "b", "c"} for i = 1, #arr do print("索引: " .. i .. ", 值: " .. arr[i]) end
输出:索引: 1, 值: a 索引: 2, 值: b 索引: 3, 值: c
- 泛型 for 循环(ipairs):
lua for i, v in ipairs(arr) do print("索引: " .. i .. ", 值: " .. v) end
输出:同上 - 注意:
ipairs
遍历从 1 开始的连续整数索引,遇到nil
停止。pairs
可遍历所有键值对,但不保证顺序,不推荐用于数组。
- 表库函数:
- Lua 的
table
库提供数组操作函数,常用包括:table.insert(t, [pos,] value)
:在指定位置插入元素,省略pos
则追加到末尾。table.remove(t, [pos])
:删除指定位置元素,省略pos
则删除最后一个。table.concat(t, [sep, [i, j]])
:连接数组元素为字符串,指定分隔符和范围。table.sort(t, [comp])
:对数组排序,可指定比较函数。
- 示例:
local arr = {10, 30, 20} table.insert(arr, 2, 15) -- 在索引 2 插入 15 print(table.concat(arr, ", ")) -- 输出:10, 15, 30, 20 table.sort(arr) -- 排序 print(table.concat(arr, ", ")) -- 输出:10, 15, 20, 30 table.remove(arr, 1) -- 删除索引 1 print(table.concat(arr, ", ")) -- 输出:15, 20, 30
- 多维数组:
- 多维数组通过嵌套表实现。
- 示例:
lua local matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } print(matrix[2][3]) -- 输出:6(第 2 行第 3 列)
- 遍历:
lua for i, row in ipairs(matrix) do for j, val in ipairs(row) do print("行: " .. i .. ", 列: " .. j .. ", 值: " .. val) end end
输出:行: 1, 列: 1, 值: 1 行: 1, 列: 2, 值: 2 行: 1, 列: 3, 值: 3 行: 2, 列: 1, 值: 4 行: 2, 列: 2, 值: 5 行: 2, 列: 3, 值: 6 行: 3, 列: 1, 值: 7 行: 3, 列: 2, 值: 8 行: 3, 列: 3, 值: 9
实际应用示例
以下是一个综合示例,展示数组的定义、操作和遍历:
-- 示例:学生成绩管理
local students = {
{name = "张伟", grades = {85, 90, 88}},
{name = "李娜", grades = {92, 95, 90}},
{name = "王芳", grades = {78, 80, 85}}
}
-- 添加成绩
table.insert(students[1].grades, 87) -- 张伟添加成绩
-- 计算平均分
local function average(grades)
local sum = 0
for _, v in ipairs(grades) do
sum = sum + v
end
return sum / #grades
end
-- 遍历学生和成绩
for i, student in ipairs(students) do
print("学生: " .. student.name)
print("成绩: " .. table.concat(student.grades, ", "))
print("平均分: " .. average(student.grades))
-- 排序成绩
table.sort(student.grades)
print("排序后成绩: " .. table.concat(student.grades, ", "))
end
-- 示例:学生成绩管理
local students = {
{name = "张伟", grades = {85, 90, 88}},
{name = "李娜", grades = {92, 95, 90}},
{name = "王芳", grades = {78, 80, 85}}
}
-- 添加成绩
table.insert(students[1].grades, 87) -- 张伟添加成绩
-- 计算平均分
local function average(grades)
local sum = 0
for _, v in ipairs(grades) do
sum = sum + v
end
return sum / #grades
end
-- 遍历学生和成绩
for i, student in ipairs(students) do
print("学生: " .. student.name)
print("成绩: " .. table.concat(student.grades, ", "))
print("平均分: " .. average(student.grades))
-- 排序成绩
table.sort(student.grades)
print("排序后成绩: " .. table.concat(student.grades, ", "))
end
输出:
学生: 张伟
成绩: 85, 90, 88, 87
平均分: 87.5
排序后成绩: 85, 87, 88, 90
学生: 李娜
成绩: 92, 95, 90
平均分: 92.333333333333
排序后成绩: 90, 92, 95
学生: 王芳
成绩: 78, 80, 85
平均分: 81
排序后成绩: 78, 80, 85
注意事项
- 索引从 1 开始:Lua 数组索引默认从 1 开始,非 0,与其他语言不同。
- 长度(
#
):只计算连续整数索引部分,遇到nil
停止。
local arr = {1, 2, nil, 4}
print(#arr) -- 输出:2
- 非连续索引:添加非连续索引(如
arr[10] = 10
)不影响#
,但可能导致遍历问题。 - 引用类型:数组是
table
,赋值时共享引用,需深拷贝处理。
local a = {1, 2}
local b = a
b[1] = 10
print(a[1]) -- 输出:10
- 性能:频繁插入/删除操作可能影响性能,建议批量操作。
- 编码:中文字符串需保存为 UTF-8 编码,避免乱码。
推荐资源
- 菜鸟教程 – Lua 表:提供简单表和数组示例。
- Lua 官方手册:权威表参考。
- LuaScripts – Lua Tutorials:实用教程和示例。
这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。
结论
Lua 的数组基于 table
实现,索引从 1 开始,支持动态操作和高效遍历。推荐使用 table
库函数(如 table.insert
、table.sort
)和 ipairs
循环管理数组,结合 local
变量优化性能。用户可通过示例练习掌握数组操作,结合 IDE(如 ZeroBrane Studio)提高开发效率。
表格总结
功能 | 描述 | 示例 |
---|---|---|
定义 | 使用 {} 创建 | local arr = {1, 2, 3} |
访问 | 通过整数索引 | arr[1] |
修改 | 直接赋值 | arr[1] = 10 |
长度 | 使用 # | print(#arr) |
插入 | table.insert(t, [pos,] value) | table.insert(arr, 10) |
删除 | table.remove(t, [pos]) | table.remove(arr, 1) |
排序 | table.sort(t, [comp]) | table.sort(arr) |
遍历 | ipairs 或数值型 for | for i, v in ipairs(arr) do print(v) end |