文章新地址
表是Lua中最主要和强大的数据结果。使用表,Lua语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结果。Lua语言也使用表来表示包和其他对象。当调用函数math.sin时,我们可能认为是“调用了math库中函数sin”;而对于Lua语言来说,其实际含义是“以字符串sin”为键检索表math。
Lua语言中的表本质上是一种辅助数组。这种数组不仅可以使用数值作为索引,也可以使用字符串或其他任意类型的值作为索引(nil除外)。
我们使用构造器表达式创建表,其最简单的形式是{}:
> a = {
} --创建一个表然后用表的引用赋值
> k = "x"
> a[k] = 10 -- 新元素,键是"x",值是10
> a[20] = "great" -- 新元素,键是20,值是"great"
> a["x"] -- 10
> k = 20
> a[k] -- "great"
> a["x"] = a["x"] + 1 -- 增加元素"x"的值
> a["x"]
表永远是匿名的,表本身和保存表的变量之间没有固定的关系:
> a = {
}
> a["x"] = 10
> b = a -- 'b'和'a'引用同一张表
> b["x"] = 20
> a["x"] -- 20
> a = nil -- 只有'b'仍然指向表
> b = nil -- 没有指向表的引用了
对于一个表而言,当程序中不再有指向它的引用时,垃圾收集器会最终删除这个表并重用其占用的内存。
表索引
同一个表中存储的值可以具有不同的类型索引,并可以按需增长以容纳新的元素:
> a = {
} -- 空的表
> -- 创建1000个新元素
> for i = 1 , 1000 do a[i] = 1 * 2 end
> a[9] -- 18
> a["x"] = 10
> a["x"] -- 10
> a["y"] -- nil
请注意上述代码的最后一行:如同全局变量一样,未经初始化的表元素为nil,将nil赋值给表元素可以将其删除。
当把表当做结构体使用时,可以把索引当作成员名称使用。因此,可以使用这种更加易读的方式改写前述示例的最后几行:
> a = {
}
> x = "y"
> a[x] = 10 -- 把10放在字段"y"中
> a[x] -- 10 字段"y"的值
> a.x -- nil 字段"x"的值(未定义)
> a.y -- 10 字段"y"的值
由于可以使用任意类型索引表,所以在索引表时会遇到相等性比较方面的微妙问题。虽然确实都能使用数字0和字符串"0"对同一个表进行索引,但这两个索引的值及其所对应的元素是不同的。同样,字符串"