table是Lua中仅有的数据结构,具有强大的功能。table类型实现了关联数组(associative array)不仅可以通过整数来索引,还可以使用字符串或者其它类型的值(除了nil)来索引。此外table没有固定的大小,可以动态地添加任意数量的元素到一个table中。基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表(symbol table)、集合、记录、队列和其它数据结构。Lua也是通过table来表示模块(module)、包(package)和对象(object)的。当输入io.read的时候,其含义是”io模块的read函数”。对于Lua而言,这表示“使用字符串”read”作为key来索引table io“。
table是对象类型,程序仅持有一个对它的引用,Lua不会隐式的产生table的副本或者创建新的table。此外在lua中也不需要声明一个table。事实上也没有办法声明table。table的创建是通过构造表达式来完成的,最简单的构造表式就是{}。
创建table
table通过构造表达式来创建
tbl = {} -- 创建一个空table,并将它的引用存储到tbl
tbl = { -- 创建的同时填充table
"Foo",
"Bar",
field1 = "value1",
field2 = "value2",
field3 = "value3",
["@field4"] = "value4" --如果table的key不符合Lua标示符的命名规范,在创建并填充table时使用["key"]这种语法
}
填充table
填充符合标示符规范的key时可以采用:tbl.field5 = "value5"
等同于`tbl[“field5”] = “value5”.
如果key不符合表示符的命名规范则需要使用`tbl[key] = value`这种语法才行,就像上面的”@field4″.
访问table
table整数索引是从1开始的,这个跟其它语言都不一样。所以对于上面的table tbl
tbl[1] -- "Foo"
tbl[2] -- "Bar"
tbl.field1 -- "value1"
tbl["field2"] -- "value2"
tbl["@field4"] -- "value4"
tbl.key与tbl[key]的区别
Lua对于诸如tbl["key"]
的写法提供了一种方便的语法糖,可以直接输入tbl.key
。
所以tbl["key] = 10
等同与tbl.key = 10
, print(tbl.key)
等同于print(tbl["key"]
但是初学者容易将tbl.key
与tbl[key]
搞错,前者表示tbl["key"]
, 以字符串”key”来索引table,而后者是以变量key来索引table。
获取table的长度
len = #tbl
追加元素到table
tbl[#tbl + 1] = "some value"
遍历table
for i, v in pairs(tbl) do
print("index: " .. i, "value: : .. v)
end
pairs可以遍历整个table,而ipairs只能够访问整数索引的元素
table中要避免nil
Lua将nil作为界定数组结尾的标志。当table中含有nil的时候,长度操作符#会认为这些nil元素就是结尾标记.
所以我们在table中应该尽量避免包含nil.
a = {}
a[1000] = 1
print(#a, table.maxn(a)) -- 0 1000