一、简介
表永远是匿名的,表本身和保存表的变量之间没有固定关系。
对于一个表而言,当程序不再有变量指向他时,垃圾收集器会最终删除这个表并重用其占用的内存。
Lua 不会进行隐藏拷贝或创建新表,操作的都是指向表的指针。
二、元素
1、键
表的键可以具有不同的类型,并且可以按需增长容纳新的元素
如果 table 是一个序列,则下标是从 1 开始,切记不是从 0 开始。
不能用 nil 作为键,否则会抛 table index is nil
错误
2、值
表的值可以通过赋值 nil 进行删除原有的项
3、获取元素
第一种: table[key]
类似 java 、 kotlin 的 map 取值 ,如果 key 对应的值并不存在,则返回 nil
第二种: table.key
这种取值等价于 table[“key”] ,记得这里是字符串,而不是 table[key]
table[key] 和 table.key 区别
两种方式从使用的角度来说是没有任何的区别
从语义上说,table[key] 表示表可以使用任意字符串作为键,table.key 表示表是被当作结构体使用,表实际上由固定的,预先定义的键组成集合
k = "jiang"
a = {
}
a[k] = 28
a[29] = "xiao"
-------------
-- 这里的 a 表有以下内容
-- "jiang" --> 28
-- 29 --> "xiao"
-------------
print(a[k]) --> 28
print(a.k) --> nil a.k 相当于 a["k"],所以就没有值
print(a.jiang) --> 28 a.jiang 相当于 a["jiang"]
4、数值作为键
任何能够被转换为整型的浮点数都会被转换成整型数(和之前数值一章的分享不谋而合)
c = {
}
c[2.0] = 10
print(c[2]) --> 10
三、表构造器
无论用哪种构造的表,都可以用 nil 赋予到对应的 key 删除对应的值。
空构造器
table1 = {
}
列表式
这种方式运行速度更快一点(相比于记录式),因为能够提前判断表大小。键会是从 1 开始往上递增的值。
-- 列表式,键会是从 1 开始往上递增的值
table2 = {
"Jiang", "peng", "yong", } -- 最有的逗号是合法的,但不会被当作元素
--> 表结构
--> 1 -- "Jiang"
--> 2 -- "peng"
--> 3 -- "yong"
记录式
key 值会被当作字符串使用,例如下面的 a key,最终形态是 “a” ,所以可以使用 table3.a 。
table3 = {
a = "1", b = 20, c = "3" }
print("table3 length: " .. #table3) --> table3 length: 0 -- 因为 lua 表并不会进行维护长度,只会记录序列的下标作为表的长度
print(table3.a, table3["b"], table3.c) --> 1 20 3
--> 表结构
--> "a" -- "1"
--> "b" -- 20
--> "c" -- "3"
混合两种
混合使用并不会有冲突,列表式的记录会从下标为 1 开始累加,记录式则还是继续使用自己的 key 。
table4 = {
name = "江澎涌", {
170, "cm" }, age = 28, {
"专业", "软件工程"