表
参考《lua程序设计》
可以认为,表是一种动态分配的对象,程序只能操作指向表的引用(或指针)。
除此以外,Lua语言不会进行隐藏的拷贝(hidden copies)或创建新的表
--创建表
a={} --创建空表
k="x"
a[k]=10 --键“x”值10
a[20]="great" --键20值“great”
print(a["x"]) -->10
k=20
print(a[k]) -->"great"
a['x']=a['x']+1
print(a["x"]) -->11
本质上a跟表是引用关系,当程序中不再有指向它的引用时,垃圾收集器会最终删除这个表并重用其占用的内存。
表索引
- 当把表当作结构体使用时,可以把索引当作成员名称使用(a.name等价于a[“name”])
- 常常会混淆a.x和a[x],实际上,a.x代表的是a[“x”],即由字符串"x"索引的表;而a[x]则是指由变量x对应的值 索引的表
- 要注意,用数字0和字符串"0"对同一个表进行索引,但这两个索引的值及其所对应的元素是不同的
- 整型和浮点型类型的表索引则不存在上述问题。由于2和2.0的值相等,所以当它们被当作表索引使用时指向的是同一个表元素
表构造器
即表的初始化,支持混用,支持嵌套
- 类似于数组
days={"Mon","Tue"} --day[1]="Mon"
- 记录式(record-like)
a={x=10,y=15} --a.x=10
PS:以上两个不能使用负数索引
- 通过方括号括起来的表达式显式地指定每一个索引
op={["+"]="add",["-"]="sub"} --op["+"]=add
数组、列表和序列
注意lua索引一般是从1开始,索引视为整数
对表而言,#操作符返回表长,但是对于表的空洞,#有争议
遍历表
- 可以使用pairs迭代器遍历表中的键值对,遍历过程中元素的出现顺序可能是随机的,相同的程序在每次运行时也可能产生不同的顺序
- 可以使用ipairs迭代器,此时,Lua会确保遍历是按照顺序进行的
- 使用数值型for循环
表标准库
table
函数 | 作用 |
---|---|
insert | 在指定位置插入一个元素,其他元素后移 |
remove | 删除并返回序列指定的元素,其他元素前移,填补空洞 |
move | 将表中的索引f到e,移动到t位置(本身是拷贝,原来不会自动nil) |