news 2026/9/2 21:25:55

Lua数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lua数组

lua数组和普通的数组不同,需要好好看看,算是lua的重点,没一个小点都有对应的代码实践,建议跟着一起敲一遍这样理解会更好一点。主要就是什么是lua的数组以及关于lua数组的一些基础和常规操作,再就是对常见问题的解决。无他唯手熟尔。

一、什么是Lua数组?

Lua中并没有传统意义上的“数组”类型,数组实际上是通过table(表)实现的特殊数据结构。更准确地说,Lua中的数组是以整数为键的有序table

-- 这是一个Lua数组 local fruits = {"苹果", "香蕉", "橙子"} print(fruits[1]) -- 输出:苹果

二、Lua数组的核心特性

1. 索引从1开始

local numbers = {10, 20, 30, 40} print(numbers[0]) -- 输出:nil print(numbers[1]) -- 输出:10 print(numbers[2]) -- 输出:20

2. 长度操作符#

local colors = {"红", "绿", "蓝"} print(#colors) -- 输出:3 -- 注意:长度操作符只对连续数组有效 local sparseArray = {[1] = "A", [3] = "C", [5] = "E"} print(#sparseArray) -- 输出可能为5,但行为不一致

三、数组基本操作

1. 创建与初始化

-- 直接初始化 local emptyArray = {} local primes = {2, 3, 5, 7, 11} -- 动态创建 local squares = {} for i = 1, 10 do squares[i] = i * i end

2. 访问与修改

local students = {"Alice", "Bob", "Charlie"} -- 访问 print(students[2]) -- 输出:Bob -- 修改 students[2] = "Bobby" print(students[2]) -- 输出:Bobby -- 添加元素 students[4] = "David" print(#students) -- 输出:4

3. 遍历数组

local scores = {85, 92, 78, 95} -- 方法1:使用数值for循环 for i = 1, #scores do print("学生" .. i .. "分数:" .. scores[i]) end -- 方法2:使用ipairs迭代器(推荐) for index, value in ipairs(scores) do print(index, value) end -- 方法3:通用pairs迭代器 for key, value in pairs(scores) do print(key, value) end

四、数组实用操作

1. 数组拼接

function concatArrays(arr1, arr2) local result = {} for i, v in ipairs(arr1) do result[i] = v end for i, v in ipairs(arr2) do result[#arr1 + i] = v end return result end local arr1 = {1, 2, 3} local arr2 = {4, 5, 6} local combined = concatArrays(arr1, arr2)

2. 数组切片

function sliceArray(arr, startIndex, endIndex) local result = {} for i = startIndex, endIndex do result[#result + 1] = arr[i] end return result end local numbers = {1, 2, 3, 4, 5, 6} local middle = sliceArray(numbers, 2, 4) -- middle = {2, 3, 4}

3. 查找元素

function findIndex(arr, value) for i, v in ipairs(arr) do if v == value then return i end end return nil end local fruits = {"apple", "banana", "orange"} print(findIndex(fruits, "banana")) -- 输出:2

五、多维数组

-- 创建3x3矩阵 local matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } -- 访问元素 print(matrix[2][3]) -- 输出:6 -- 遍历多维数组 for i = 1, #matrix do for j = 1, #matrix[i] do io.write(matrix[i][j] .. " ") end print() end

六、数组与table的混合使用

-- 混合数据结构 local employee = { name = "张三", age = 28, skills = {"Lua", "Python", "C++"}, -- 数组部分 projects = { -- 多维混合结构 {name = "项目A", role = "开发"}, {name = "项目B", role = "测试"} } } -- 访问混合结构 print(employee.name) -- 输出:张三 print(employee.skills[2]) -- 输出:Python print(employee.projects[1].name) -- 输出:项目A

七、性能优化与最佳实践

1. 避免创建稀疏数组

-- 不推荐:稀疏数组 local badArray = {} badArray[1] = "A" badArray[1000] = "B" -- 中间有大量nil值 -- 推荐:紧凑数组 local goodArray = {} for i = 1, 1000 do goodArray[i] = "default" end goodArray[1000] = "B"

2. 使用table.concat进行字符串拼接

local words = {"Hello", "World", "from", "Lua"} -- 低效方式 local result = "" for i, word in ipairs(words) do result = result .. word .. " " end -- 高效方式 local efficientResult = table.concat(words, " ")

3. 预分配数组大小(如果需要)

local function createLargeArray(size) local arr = {} -- 预分配空间(Lua 5.3+) if math.tointeger then arr = table.new(size, 0) end for i = 1, size do arr[i] = i end return arr end

八、实战示例:学生成绩管理系统

local StudentManager = {} function StudentManager.new() return { students = {}, count = 0 } end function StudentManager:addStudent(name, scores) self.count = self.count + 1 self.students[self.count] = { id = self.count, name = name, scores = scores or {}, average = 0 } self:calculateAverage(self.count) return self.count end function StudentManager:calculateAverage(studentIndex) local student = self.students[studentIndex] if #student.scores > 0 then local total = 0 for _, score in ipairs(student.scores) do total = total + score end student.average = total / #student.scores end end function StudentManager:getTopStudents(limit) -- 创建副本排序 local sorted = {} for i = 1, self.count do sorted[i] = self.students[i] end table.sort(sorted, function(a, b) return a.average > b.average end) return sliceArray(sorted, 1, limit or 5) end -- 使用示例 local manager = StudentManager.new() manager:addStudent("小明", {85, 90, 88}) manager:addStudent("小红", {92, 95, 89}) manager:addStudent("小刚", {78, 82, 80}) local topStudents = manager:getTopStudents(3) for i, student in ipairs(topStudents) do print(string.format("%d. %s: %.2f", i, student.name, student.average)) end

九、常见问题与解决方案

Q1: 数组长度不准确?

-- 问题:数组中有nil值 local problematic = {1, 2, nil, 4} print(#problematic) -- 输出可能是2或4 -- 解决方案:使用自定义长度函数 function safeLength(arr) local count = 0 for _ in ipairs(arr) do count = count + 1 end return count end

Q2: 数组浅拷贝问题?

local original = {{name = "test"}, {name = "demo"}} local copy = {} -- 错误方式:浅拷贝 for i, v in ipairs(original) do copy[i] = v -- 只复制了引用! end -- 正确方式:深拷贝(简化版) function deepCopyArray(arr) local result = {} for i, v in ipairs(arr) do if type(v) == "table" then result[i] = deepCopyArray(v) else result[i] = v end end return result end

总结

Lua数组作为table的特殊应用,具有灵活、易用的特点。关键要点:

  1. Lua数组本质是索引为整数的table

  2. 索引从1开始,使用#获取长度

  3. 推荐使用ipairs进行遍历

  4. 避免稀疏数组以保持性能

  5. 利用table库函数简化操作

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 4:29:19

中国AI的致命短板:超越“追赶”,构建文明级战略操作系统

中国AI的致命短板:超越“追赶”,构建文明级战略操作系统 埃里克施密特的发言,一针见血地指出了中美AI竞赛中一个常被忽视的结构性差距:资本深度与创新生态的鸿沟。他揭示的并非单纯的技术落后,而是支撑技术爆炸的底层…

作者头像 李华
网站建设 2026/8/31 2:35:11

AI Agent 工程失效的确定性来源与 EDCA 控制解法(工程向)

本文默认读者具备 Agent 系统工程背景,默认读者有EDCA 体系概念 不讨论模型能力,不讨论 Prompt 技巧。1. Agent 失效不是“不聪明”,而是控制面缺失在真实工程中,以下问题高度重复出现:长任务中决策不可预测多 Agent 协…

作者头像 李华
网站建设 2026/8/31 3:21:31

如何在CSDN创作一篇98分高质量的技术博客?

如何在CSDN创作一篇98分高质量的技术博客? 摘要 在CSDN上创作一篇技术博客,如何才能达到98分的高质量?这不仅仅是关于内容本身的深度与广度,还包括文章的结构、排版、互动性等多个方面。本文将介绍如何从各个方面提升你的技术博…

作者头像 李华
网站建设 2026/8/28 20:44:25

非阻塞socket上getsockopt函数的使用要点及常见误解

在网络编程中,理解并正确使用非阻塞socket上的getsockopt函数,是确保程序行为可控、性能高效的关键。许多开发者误以为在非阻塞模式下,所有操作都变得简单,实际上,像getsockopt这样的“查询”操作也隐含着微妙的陷阱和…

作者头像 李华
网站建设 2026/8/28 9:43:37

探究comsol案例:水平井应力场耦合作用机制与实践应用

comsol案例水平井应力场耦合在青海某页岩气田的钻探现场,老张盯着实时监测屏幕上突然飙升的井口压力直挠头。这种地层应力突变导致套管变形的糟心事,搞石油工程的同行们应该都不陌生。今天咱们就扒一扒COMSOL里怎么玩转水平井应力场耦合,保准…

作者头像 李华
网站建设 2026/9/2 10:22:05

互联网大厂求职面试:从Spring Boot到微服务的全面考察

文章内容: 场景: 在一家知名互联网大厂的会议室里,面试官正准备对一位名叫“超好吃”的Java小白进行技术面试。面试官以严肃但鼓励的态度展开了这次面试。第一轮:基础技术与框架 面试官:"超好吃,欢迎你…

作者头像 李华