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