【Lua基础系列】之类型与值 (表Table)
大家好,我是Lampard~~
欢迎来到Lua基础系列的博客
PS:本博客知识参考资料为:《Lua程序设计第四版》,该书由Lua的创始人2018年所编著,所以大家可以放心去吸收知识
前文再续,书接上一回。
今天要接着讲Lua中的基本类型table。
(一)表Table类型
表是Lua语言中最强大也是唯一的数据结构。使用表,Lua语言可以以一种简单,统一且高效的方式表示数组,集合,记录和其他很多的数据结构。
Lua语言中的表本质是一种辅助数组,这种数组不仅可以通过数字下标作为索引,也可以通过使用字符串或其他任意类型的值来映射相对应的值(键值对)。
我们使用构造器表达式创建表,其最简单的形式是{}
a = {} -- 创建了一个空表
k = “x”
a[k] = 10 -- 这句话的意思是a["x"]=10,键是“x”,值是10,此时我们可以通过a.x和a["x"]访问到10
a[10] = "Hello Table" --这句话的意思是,索引是10,值是字符串“Hello Table”
表永远是匿名的,表本身和保存表的变量之间没有固定的关系。当没有变量指向表的时候,Lua会对其进行自动回收。
a = {} -- a指向一个空表
a["x"] = 10 -- a的"x"键赋值为10
b = a -- b指向a这个表
print(b["x"]) -- 此时答案为10
b["x"] = 20
print(a["x"]) -- 此时答案为20
-- 说明a和b指向的是同一张表,并没有进行深拷贝
a=nil -- 只剩下b指向这张表
b=nil -- Lua自动回收
(1)表索引
同一个表中存储的值可以有不同的类型索引:既不同类型的键。未经初始化的表元素为nil。
当把表当做结构体使用时,可以把索引当做成员名称使用。
对于Lua语言而言,这两种形式是等价的。但是对于阅读程序的人而言,这两种形式分别代表了两种意图:当你用a.name来赋值时,清洗地说明了把表当做结构体使用,此时的标识由预先定义的键组成的集合。而使用a【“name”】来赋值,则说明了表可以使用任意字符串当做键。
(2)表构造器
除了使用空构造器{}构造表之外我们还可以这样做:
注意:Lua中默认值是从1开始
days = {“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”}
--[[ 此时days[1]到days[7]被默认定义为“Monday”~“Sunday” ]]
Lua语言还提供了一种初始化记录式表的特殊语法:
a = {x = 10 , y = 20}
-- 上面的写法等价于 a["x"]=10,a["y"]=20
在同一个构造器中,可以混用记录式和列表式写法;
polyLine = {
color = "blue",
thickness = 2,
npoints = 4,
{x=0,y=0}, --[[ 类似二维数组,此时polyLine[1]={x=0,y=0}
{x=-10,y=1}, polyLine[2]={x=-10,y=1}
{x=0,y=1} polyLine[3]={x=0,y=1] ]]
}
(3) 数组,列表和序列
如果想表示常见的数组或者列表,那么只需要使用整形作为索引的表即可。当该表不存在空洞,既表中的所有数据都不为nil时,则成这个表为序列(sequence)。
Lua语言提供了获取序列长度的操作符#。正如我们之前所看到,对于字符串而言,该操作符但会字符串的字节数。对于表而言,则会返回序列的大小。
因而,当我们想在序列后增加元素时则可以使用语句 a[#a+1]=new
(4) 遍历表
我们可以使用pairs迭代器遍历表中的键值对。遍历过程中元素出现的顺序可能是随机的,相同的程序在每次运行时也可能产生不同的顺序。唯一可以确定的是,在遍历的过程中每个元素会且只会出现一次。
对于序列而言我们可以使用ipairs迭代器:此时Lua确保是按顺序进行的
(5)表标准库
表标准库提供了操作列表和序列的一些常用函数。
今天简单介绍增加(insert),删除(remove),移动move(),以及排序(sort)。
table.insert ()
insert()有两种格式,一种是两个参数,insert(tableName,元素),这种情况下就会默认插到末尾。
另一种是三个参数(tableName,位置,元素),则可以按照自己的想法插入元素。
table.remove()
删除指定位置的元素,并把后面的元素往前移动填充删除所造成的空洞。
table.move(tableA,起始索引,终止索引,tableB)
它的作用时把表A中从起始索引到终止索引的值移动到表B中
table.sort()
这个就是单纯的排序方法。