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", "pear", "orange", "grape"}
table.insert(tbl, "watermelon")
print(table.concat(tbl, "、"))
table.insert(tbl, 2, "watermelon")
print(table.concat(tbl, "、"))
maxn
函数 table.maxn 是返回 table 最大的正数索引值,用法:
复制代码 代码如下:
table.maxn (table)
如果不存在正数的索引值,则返回 0。
复制代码 代码如下:
local tbl = {"apple", "pear", "orange", "grape"}
print(table.maxn(tbl))
local tbl = {"apple", "pear", "orange", "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", "pear", "orange", "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", "pear", "orange", "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", "pear", "orange", "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", "pear", "orange", "grape"}
print(table.unpack(tbl))
local a, b, c, d = table.unpack(tbl)
print(a, b, c, d)
print(table.unpack(tbl, 2))
print(table.unpack(tbl, 2, 3))
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。