Table
是Lua
中一种重要的数据结构,可以将其视为关联数组(associate array
),除了nil
以外,数字,字符串,Lua
语言中的其它值均可成为数组的key
。Lua
也使用table
来代表包(package
)和对象(object
)。比如io.read
就可以理解为“io
”模块的read
函数。
Table
在Lua
中既不是“值(value
)”,也不是“变量(variable
)”,而是对象(object
)——一个动态分配的对象。Table
都是匿名的,程序只能通过“引用(reference
)”(或称之为“指针”)来操作它。当程序中所有指向某个table
的引用都无效后,Lua
的垃圾回收程序会回收这个table
的内存。程序没有办法声明(declare
)一个table
,而只能通过构造表达式(constructor expression
)来创建一个table
,就像这样:
a = {}
同全局变量一样,没初始化的table
元素的值为空:
> a = {}
> print(a["x"])
nil
同样,把table
元素的值设为nil
就会删除这个元素。这并不是个巧合,其实在Lua
中,全局变量就是存在一个table
里。
使用table
时,要注意table["name"]
,table.name
和table[name]
三者的区别。其中table["name"]
和table.name
是一样的,table
的key
都是"name"
这个字符串。而table[name]
的key
则是name
变量的值。参考下面这个例子:
> name = "a"
> table["name"] = 10
> table[name] = 20
> print(table["name"])
10
> print(table.name)
10
> print(table[name])
20
> print(table["a"])
20
使用整数作为key
,就可以让table
变成通常意义上的数组(array
)或列表(list
)。需要额外注意的是,在 Lua
中,使用1
(不是0
)来索引数组第一个元素,这个一定要注意!!
如果一个列表中间没有“洞”,即nil
元素,则称之为序列(sequence
),对于序列,可以使用长度运算符#
获得序列的长度:
> a = {}
> a[1] = 10
> a[2] = 20
> print(#a)
2