表( Table
)是 Lua
语言中最主要(事实上也是唯一的)和强大的数据结构。使用表, Lua
语言可以以一种简单、统一且高效的方式表示数值、集合、记录和其他很多数据结构。 Lua
语言也是用表来表示包( package
)和其他对象。当调用函数 math.sin
时,我们可以认为是"调用了math库中函数sin";而对于 Lua
语言来说,其实际含义是:"以字符串"sin"为键检索表math"。
Lua
语言中的表本质上是一种辅助数组(associative array),这种数组不仅可以使用数值作为索引,也可以使用字符串或其他任意类型的值作为索引( nil
除外)。
Lua
语言中的表要么是值要么是变量,他们都是对象( object
)。如果对 Java
或者 Scheme
中的数值概念比较熟悉,那么应该很容易理解上述概念。可以认为,表是一种动态分配的对象,程序只能操作指向表的引用(或指针)。除此之外, Lua
语言不会进行隐藏的拷贝或创建新的表。
我们使用构造器表达式创建表,其最简单的形式是: {}
> 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"] --> 11
:::warning 注意 表永远是匿名的,表本身和保存表的变量之间没有固定的关系:
> a = {} > a["x"] = 10 > b = a -- 'b'和'a'引用同一张表 > b["x"] --> 10 > b["x"] = 20 > a["x"] --> 20 > a = nil -- 只有'b'仍然指向表 > b = nil -- 没有指向表的引用了
:::
对于一个表而言,当程序中不在有指向它的引用时,垃圾收集器会最终删除这个表并重用其占用的内存。