Lua中的table学习笔记

table 在 Lua 里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组、记录、线性表、队列、集合等数据结构都可以用 table 来表示,甚至连全局变量(_G)、模块、元表(metatable)等这些重要的 Lua 元素都是 table 的结构。可以说,table  是一个强大而又神奇的东西。

table 特性

在之前介绍 Lua 数据类型时,也说过了 table 的一些特性,简单列举如下(详情可查看之前的介绍):

1.table是一个“关联数组”,数组的索引可以是数字或者是字符串
2.table 的默认初始索引一般以 1 开始
3.table 的变量只是一个地址引用,对 table 的操作不会产生数据影响
4.table 不会固定长度大小,有新数据插入时长度会自动增长
5.table 的方法函数

Lua 5.2.2 内置有以下 7 中对 table 操作的方法:

concat

函数 table.concat 主要用来把表里的每个元素通过一个分隔符(separator)连接组合起来,用法:

复制代码 代码如下:

table.concat(table,sep,  start,end)

上面除 table 外, sep、start、end 这三个参数都是可选的,并且顺序读入的,如果没指定传入,函数 concat 会采用默认值(分隔符 sep 的默认值是空字符,start 的默认值是 1,end 的默认值是数组部分的总长)去执行。

复制代码 代码如下:

local tbl = {"apple","pear","orange","grape"}
 
print(table.concat(tbl))
 
print(table.concat(tbl,"、"))
 
print(table.concat(tbl,"、",2))
 
print(table.concat(tbl,2,3))

对于密集型的字符并接,table.concat 比用 ".." 连接更高效,下面是用 time 测试的效果:

复制代码 代码如下:

local str = {}
for i = 1,10000 do
    str[i] = "str"
end
print(table.concat(str))
--real  0m0.005s
--user  0m0.003s
--sys   0m0.002s

复制代码 代码如下:

local str = ""
for i = 1,10000 do
    str = str .. "str"
end
print(str)
--real  0m0.041s
--user  0m0.037s
--sys   0m0.002s

insert

函数 table.insert 用于向 table 的指定位置(pos)插入一个新元素,用法:

复制代码 代码如下:

table.insert(table,pos value)

参数 pos 是可选,默认是 table 末尾位置。

复制代码 代码如下:

local tbl = {"apple","grape"}
 
table.insert(tbl,"watermelon")
print(table.concat(tbl,"、"))
 
table.insert(tbl,"、"))

maxn

函数 table.maxn 是返回 table 最大的正数索引值,用法:

复制代码 代码如下:

table.maxn (table)

如果不存在正数的索引值,则返回 0。

复制代码 代码如下:

local tbl = {"apple","grape"}
print(table.maxn(tbl))
 
local tbl = {"apple","grape",[26] = "watermelon"}
print(table.maxn(tbl))
 
local tbl = {[-1] = "apple",[-2] = "pear",[-3] = "orange",[-4] = "grape"}
print(table.maxn(tbl))

pack

函数 table.pack 是获取一个索引从 1 开始的参数表 table,并会对这个 table 预定义一个字段 n,表示该表的长度,用法:

复制代码 代码如下:

table.pack(・・・)

该函数常用在获取传入函数的参数。

复制代码 代码如下:

function table_pack(param,...)
    local arg = table.pack(...)
    print("this arg table length is",arg.n)
    for i = 1,arg.n do
        print(i,arg[i])
    end
end
 
table_pack("test","param1","param2","param3")

remove

函数 table.remove 用于删除 table 里某个值,用法:

复制代码 代码如下:

table.remove (list [,pos])

参数 pos 可选,默认为删除 table 最后一个元素,并且参数 pos 的类型只能是数字 number 类型。

复制代码 代码如下:

local tbl = {"apple","grape"}
table.remove(tbl,2)
print(table.concat(tbl,"、"))
 
table.remove(tbl)
print(table.concat(tbl,"、"))

sort

函数 table.sort 用于对 table 里的元素作排序操作,用法:

复制代码 代码如下:

table.sort(table,comp)

参数 comp 是一个排序对比函数,它有两个参数 param1、param2,如果 param1 排在 param2 前面,那么排序函数返回 true,否则返回 false。

复制代码 代码如下:

local tbl = {"apple","grape"}
local sort_func1 = function(a,b) return a > b end
table.sort(tbl,sort_func1)
print(table.concat(tbl,"、"))
 
local sort_func2 = function(a,b) return a < b end
table.sort(tbl,sort_func2)
print(table.concat(tbl,"、"))

参数 comp 可选,缺省 comp 的情况下是对表作升序排序。

复制代码 代码如下:

local tbl = {"apple","grape"}
table.sort(tbl)
print(table.concat(tbl,"、"))

unpack

函数 table.unpack 用于返回 table 里的元素,用法:

复制代码 代码如下:

table.unpack(table,start,end)

参数 start 是开始返回的元素位置,默认是 1,参数 end 是返回最后一个元素的位置,默认是 table 最后一个元素的位置,参数 start、end 都是可选

复制代码 代码如下:

local tbl = {"apple","grape"}
print(table.unpack(tbl))
 
local a,b,c,d = table.unpack(tbl)
print(a,d)
 
print(table.unpack(tbl,2))
print(table.unpack(tbl,3))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340