2019独角兽企业重金招聘Python工程师标准>>>
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"]) --->10a[20] = "great" -- 新条目,key = 20, value = "great"
k = 20
print(a[k]) -->"great"
a["X"] = a["X"] + 1
print(a["X"]) --- > 11
Table 永远是"匿名的",一个持有Table的变量与Table自身之间没有固定的关联性。
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会自动增长。
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”作为索引的起始值。
在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