## 5.Table
Lua的table類型比較強大,用過都知道,它的index不僅可以使用number,還能使用string等其他的值,nil除外。table沒有固定的size,你可以動態地向table中添加元素。table是Lua中的主要數據結構。在Lua中,我們用table來表示普通數組,符號表,set,record,queue和其他的lua數據結構。Lua也使用table來表示module,package和其他的對象。當我們寫io.read時,我們的意思是“io模塊的read函數”,對Lua來說,它理解為“從名為io的table中以‘read’為key進行索引”。
在Lua中,table既不是值,也不是變量,而是對象。你可以理解成一個動態分配的對象,程序通過引用(或指針)來操作它。在后臺沒有隱藏的副本或者新table的創建(像按值傳參那樣,操作的是一個新復制的副本)。要創建一個table,只需要一個簡單的表達式{ }:

table總是匿名的。table本身和存儲table的變量,二者之間沒有固定的聯系:

當程序里不再引用一個table的時候,Lua的垃圾收集器會刪除這個table并重用它的內存。
同一個table中可以存儲不同index類型的值,并且table的大小可以動態增長

注意最后一行,像全局變量一樣,如果table中未初始化的field值為nil,可以通過賦值nil的方式來刪除一個table.
可以在Lua中使用record方式來索引值,a.name這種格式,相當于a["name"].

注意,a.x==a["x"] != a[x]
Lua的table的index值從1開始,不是從0,這個要格外注意
下圖描述一下Lua的size運算符'#'的用法,它是以table中第一個值為nil的位置為end的,就像C語言的string是以'\0'為end一樣,所以,用'#'的話,table中就不能有hole(值為nil的),仔細看下面的圖,你會明白的。

注意最后兩句,可以看出'#'和'table.maxn()'的功力。
因為a中第4個位置為nil,因此用'#'算出來就是3,而table.maxn就可以得到5.
table.maxn函數打印最大的數字index值
## 6.Functions
Function在lua中是屬于first-class值,可以存儲到變量中,可以作為參數傳遞給其他的function,可以作為function的result來return。
Lua中,可以調用用lua或C語言實現的函數。Lua本身就是用C實現的。它實現了string,table,io,math,debug等基本的庫,程序可以自己定義其他的函數來擴展功能。
這部分在后續的博客中會繼續深入挖掘一下
## 7.Userdata和Threads
userdata類型允許任意的C數據存入到lua的變量中,關于此類型,Lua中沒有什么預定義的操作,除了復制和相等比較。此類型是為了表示由程序創建的一些數據類型;例如,io庫用userdata類型來表示file。
具體的userdata和thread相關,后續隨著學習進行會繼續深入挖掘。
水平有限,如果有朋友發現錯誤,歡迎留言交流。