关键要点

  • 研究表明,Lua 的数组是基于 table 实现的特殊数据结构,索引默认从 1 开始,适合存储有序数据。
  • 证据显示,数组通过 table 的整数键访问,支持动态扩容,常用 # 获取长度,ipairs 遍历元素。
  • 看起来很可能是通过 table 库函数(如 table.inserttable.remove)操作数组,结合 local 变量优化性能。

Lua 数组简介

概述

在 Lua 中,数组(array)是使用 table 数据结构实现的特殊形式,用于存储有序的元素序列。Lua 的数组索引默认从 1 开始(而非 0),支持动态添加或删除元素,操作灵活。数组通过整数键访问,结合 table 库函数和循环实现高效的数据管理。本文详细讲解 Lua 数组的定义、操作、遍历、示例及注意事项,特别适合中文用户学习。

数组特性
  • 实现:基于 table,使用连续整数键存储元素。
  • 索引:默认从 1 开始,可自定义。
  • 长度:使用 # 运算符获取连续整数索引的元素数。
  • 操作:通过 table.inserttable.remove 等函数增删元素。
  • 遍历:使用 ipairs 循环或数值型 for 循环遍历。
  • 动态性:支持动态扩容和收缩,无需预定义大小。
参考资源

详细调研报告

本文为用户提供关于 Lua 数组的全面中文讲解,涵盖数组定义、基本操作、遍历、表库函数、示例及注意事项,基于可靠的在线资源和官方文档。

Lua 数组概述

Lua 的数组是 table 的子集,使用连续整数键(通常从 1 开始)存储有序数据。研究表明,Lua 数组通过 table 的灵活性实现动态管理,结合 table 库函数和循环提供高效操作。以下是详细分析:

  • 数组定义

    • 数组是 table 的特殊形式,元素以连续整数键存储。
    • 语法
      local arr = {元素1, 元素2, 元素3}
      
    • 示例
      local fruits = {"apple", "banana", "orange"}
      print(fruits[1])  -- 输出:apple
      print(type(fruits))  -- 输出:table
      print(#fruits)    -- 输出:3(数组长度)
      
    • 注意
      • 索引从 1 开始,与 C/C++ 等语言不同。
      • 数组是 table,可混用非整数键,但影响 # 的行为。
  • 基本操作

    • 访问元素:通过整数索引访问,如 arr[1]
      local arr = {10, 20, 30}
      print(arr[2])  -- 输出:20
      
    • 修改元素:直接赋值修改。
      arr[2] = 25
      print(arr[2])  -- 输出:25
      
    • 添加元素
      • 直接赋值到新索引:
        arr[4] = 40
        print(#arr)  -- 输出:4
        
      • 使用 table.insert
        table.insert(arr, 50)  -- 添加到末尾
        print(arr[5])  -- 输出:50
        
    • 删除元素
      • 赋值为 nil(可能导致非连续索引):
        arr[2] = nil
        print(arr[2])  -- 输出:nil
        
      • 使用 table.remove
        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 循环
      local arr = {"a", "b", "c"}
      for i = 1, #arr do
          print("索引: " .. i .. ", 值: " .. arr[i])
      end
      
      输出:
      索引: 1, 值: a
      索引: 2, 值: b
      索引: 3, 值: c
      
    • 泛型 for 循环(ipairs)
      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
      
  • 多维数组

    • 多维数组通过嵌套表实现。
    • 示例
      local matrix = {
          {1, 2, 3},
          {4, 5, 6},
          {7, 8, 9}
      }
      print(matrix[2][3])  -- 输出:6(第 2 行第 3 列)
      
    • 遍历
      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 编码,避免乱码。
推荐资源

这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。

结论

Lua 的数组基于 table 实现,索引从 1 开始,支持动态操作和高效遍历。推荐使用 table 库函数(如 table.inserttable.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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐