Lua笔记(3)——table浅析

TableLua中一种重要的数据结构,可以将其视为关联数组(associate array),除了nil以外,数字,字符串,Lua语言中的其它值均可成为数组的keyLua也使用table来代表包(package)和对象(object)。比如io.read就可以理解为“io”模块的read函数。

TableLua中既不是“值(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.nametable[name]三者的区别。其中table["name"]table.name是一样的,tablekey都是"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

发表评论

邮箱地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.