表
Lua语言中的表本质上是一种辅助数组(associative array),这种数组不仅可以使用数值作为索引,也可以使用字符串或其他任意类型的值作为索引(nil除外)。
Lua语言中的表要么是值要么是变量,它们都是对象(object),表是一种动态分配的对象,程序只能操作指向表的引用(或指针)。除此以外,Lua语言不会进行隐藏的拷贝(hidden copies)或创建新的表
对于一个表而言,当程序中不再有指向它的引用时,垃圾收集器会最终删除这个表并重用其占用的内存。
当语句 b = a,指的是b这个引用也指向了a指向的表,指向的是同一张表
表索引值
同一个表中存储的值可以具有不同的类型索引,并可以按需增长以容纳新的元素
将nil赋值给表元素可以将其删除,Lua语言实际上就是使用表来存储全局变量的
当把表当作结构体使用时,可以把索引当作成员名称使用
a.x代表的是a["x"],即由字符串"x"索引的表;而a[x]则是指由变量x对应的值索引的表
2和2.0的值相等,所以当它们被当作表索引使用时指向的是同一个表元素,当被用作表索引时,任何能够被转换为整型的浮点数都会被转换成整型数
表构造器
表构造器(Table Constructor)是用来创建和初始化表的表达式
在同一个构造器中,可以混用记录式(record-style)和列表式(list-style)写法
通过方括号括起来的表达式显式的指定每一个索引
数组,列表和序列
如果想表示常见的数组(array)或列表(list),那么只需要使用整型作为索引的表即可
我们把这种所有元素都不为nil的数组称为序列(sequence),也就是整个数组是全部有效的,没有空洞,可以将末尾设置成nil来标记数组的长度
操作符 # 也可以用于表,返回表对应的序列的长度
对于中间存在空洞(nil值)的列表而言,序列长度操作时不可靠的
不包含数值类型的键的表就是长度为零的序列
遍历表
pairs 顺序是随机的,保证每个元素出现一次
ipairs 遍历,保证按顺序遍历
使用数值型for循环
安全访问
对表进行了6次访问,改写成下面这样
于表达式a or{},当a为nil时其结果是一个空表
表中的每个字段名都只是用了一次,从而保证了尽可能少的对表进行访问,本例中访问了三次,同时避免了引入新的操作符
表标准函数
函数table.insert向序列的指定位置插入一个元素,其他元素依次后移
对于列表t={10,20,30},在调用table.insert(t,1,15)后它会变成{15,10,20,30}
调用时不指定位置的话会直接插在末尾不移动任何元素
函数table.remove删除并返回序列指定位置的元素,然后将其后的元素向前移动填充删除元素后造成的空洞。如果在调用该函数时不指定位置,该函数会删除序列的最后一个元素
函数table.move(a,f,e,t),调用该函数可以将表a中从索引f到e的元素(包含索引f和索引e对应的元素本身)移动到位置t上,这样就可以空出第一个元素的位置,方便模拟栈