Table是Lua中主要数据结构机制,基于Table,能够以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其余数据结构。Table是没有固定大小的,能够动态地添加任意数量的元素到一个Table中。数组
Lua中的table类型实现了“关联数组”。能够在“关联数组”中使用整数、字符串或其余类型的值(nil除外)来索引它。数据结构
在Lua中,Table既不是“值”也不是“变量”,而是“对象”。能够将一个Table想象成一种动态分配的对象,程序仅支持有一个对它的引用(或指针),Lua不会暗中生成Table的副本或建立新的Table。能够经过“构造表达式”完成Table表的建立,最简单的构造表达式就是{}。函数
a = {} --建立一个table,并将它的引用存储到a k = "X" a[k] = 10 ---新条目,key = "X" , value = 10 print(a["X"]) --->10 a[20] = "great" -- 新条目,key = 20, value = "great" k = 20 print(a[k]) -->"great" a["X"] = a["X"] + 1 print(a["X"]) --- > 11
Table 永远是"匿名的",一个持有Table的变量与Table自身之间没有固定的关联性。lua
a = {} a["X"] = 10 b = a --- b与a引用了同一个Table。 print(b["X"]) --- 10 b["X"] = 20 print(a["X"]) --- 20 a = nil --如今只有b还在引用Table b = nil --再也没有对Table的引用了。 一个Table的多个引用在对Table进行修改,修改的是全局的概念。当一个程序再也没有一个Table的引用时,Lua的垃圾收集器最终会删除该Table,并复用它的内存。
全部Table均可以有不一样类型的索引来访问value值,当须要容纳新条目时,Table会自动增加。spa
a = {} --空的table -- 建立1000个新条目 for i = 1, 1000 do a[i] = i*2 end print(a[9]) --> 18 a["X"] = 10 print(a["X"]) -->10 print(a["y"]) -->nil 当table的某个元素没有初始化时,他的内容就是nil。另外能够像全局变量同样,将nil赋予table的某个元素来删除该元素。(Lua中,全局变量也是存储在一个普通的table中)
为了表示一条记录,能够将字段名做为索引。lua中有“语法糖”的概念:指针
a["name"] == a.name
如果要表示一个传统的数组或线性表,只需以整数做为key来使用table便可。Lua中数组一般以“1”做为索引的起始值。code
在Lua5.1中,长度操做符“#”用于返回一个数组或线性表的最后一个索引值!对象
对于全部未初始化的元素的索引结果都是nil。Lua将nil做为界定数组结尾的标志。当一个数组有“空隙”时,即中间含有nil时,长度操做符会认为这些nil元素就是结尾标记。若是须要处理那些含有“空隙”的数组,可使用函数table.maxn,它将返回一个table的最大正索引数:索引
a = {} a[10000] = 1 print(table.maxn(a)) ---》10000
当对索引的实际类型不是很肯定时,能够明确地使用一个显示的转换:队列
i = 10 j = "10" k = "+10" a = {} a[i] = "one value" a[j] = "another value" a[k] = "yet another value" print(a[j]) --->another value print(a[k]) --->yet another value print(a[tonumber(j)]) --->one value