1. 程式人生 > >【笨木頭Lua專欄】基礎補充01:巧說table的幾種構造方式

【笨木頭Lua專欄】基礎補充01:巧說table的幾種構造方式

之前對於Lua的研究都是紙上談兵,沒有真正的專案練手,現在公司的專案基本上都是用Lua開發,是時候補充一下我那蹩腳的Lua知識了。

基礎資料型別、表示式、迴圈結構什麼的我就不說了,這麼簡單的東西說了也要被大家噴。

今天我想說說table的幾種構造方式。

本文來自[笨木頭與遊戲開發],笨木頭花心奉獻,花心?不呢,是用心。

0.Lua除錯工具——LuaEditor

首先,如果你是第一次接觸Lua,請補充一下Lua的最基本之中的基礎語法(小若:O O!),然後下載一個LuaEditor工具,用來檢視Lua執行效果,當然也可以除錯,本篇內容不解釋這個工具。下載地址:http://www.bego.cc/file/22357242

 當然,也可以百度一下。

1.什麼是table?

table是Lua最複雜最強大的資料結構,Lua本身並不是面嚮物件語言,但是對面向物件中毒比較深的程式設計師,可以藉助table”完美”地模擬面向物件程式設計。最簡單地,我們可以把table理解為陣列,最複雜的,我們可以把table理解為”世間萬物”,因為它可以創造出很多你想象不到的東西。一個字,自由度非常大~!(小若:一個字,你妹~!)

2.如何建立一個table?

建立table是一件很複雜的事情,不知道大家頂不頂得住,試試看,如下:

local a = {}


這樣就建立了一個table了。

(小若:噗,真夠複雜的…啊,你妹啊,複雜你個頭!)

3.如何初始化一個table

嗷,雖然建立table已經很複雜了,更復雜的還在後面,怎麼初始化table?看看下面的程式碼:

local a = {["x"] = 12, ["mutou"] = 99, [3] = "hello"}

print(a["x"]);

在LuaEditor中建立一個lua檔案,輸入以上程式碼,儲存,然後按F5執行,我們將看到輸出視窗輸出了一個數字:12。
這挺神奇的,感覺就像是在定義陣列,不是嗎?
table間的元素用逗號分隔,["x"] = 12代表構造一個table元素,下標為”x”,值為12。(小若:為毛陣列下標可以是字串?)

嗷~!我就等旁白問這個問題,旁白你笨蛋啊,我只是說table像陣列,我沒有說它就是陣列,table支援幾乎是所有型別的下標,包括函式。
(小若:。。。以後我不會中計了,喵…)


4.有更簡潔的方式
這種初始化方式看起來太複雜了,有沒有簡單點的?看看下面的程式碼:

local a = {x = 12, mutou = 99, [3] = "hello"}

print(a["x"]);

執行結果仍然是輸出12,也就是說,對於字串下標,我們可以省略方框和雙引號,但是數字下標不可以,千萬不要搞混了。
但是,a["x"]這種呼叫方式也很煩人不是嗎?程式設計師都很懶的,所以Lua支援一下這種方式的呼叫:
 local a = {x = 12, mutou = 99, [3] = "hello"}

print(a.x);

輸出結果仍然是12,也就是說,對於字串下標,可以直接用a.x的形式呼叫,也是省略了方框和雙引號,初始化和呼叫方式的規則一樣,這樣大家就不會搞混了,記住,是字串下標才這麼做。
記住,是字串下標才這麼做。
記住,是字串下標才這麼做。(小若:你再說一句試試,我保證以後不幫你吐槽。)

5.想要預設數字索引怎麼辦?
如果說,大家習慣了陣列,用數字下標,又不想自己一個個數字地定義,比如:

local a = {[1] = 12, [2] = 43, [3] = 45, [4] = 90}

沒關係,Lua又為愛偷懶的程式設計師提供了一招,如下:
local a = {12, 43, 45, 90}
print(a[1]);

看看a[1]輸出的值是不是12?(小若:但是12的下標應該是0啊,陣列下標是從0開始計算的)
再一次警告旁白,table類似陣列,但它絕對不是陣列。
table預設的第一個索引下標是1,並且很多相關的函式也假設table的第一個索引下標為1,所以大家最好遵守這個規則。

6.更強大的應用之table的table
table什麼都能放,當然也能放table了,如下:

local a = {
 {x = 1, y = 2},
 {x = 3, y = 10}
}
print(a[1].x);

我們定義了一個table,命名為a,table有兩個元素,分別是兩個沒有名字的table,根據第5條所說的規則,沒有顯示指定下標,那Lua就會預設給table的元素賦予下標(從1開始)。
因此,a的第一個元素就是{x = 1, y = 2},呼叫a的第一個元素的方式為:a[1]
由於a[1]又是一個table,所以,再次呼叫table的x下標的值:a[1].x
這樣就OK了。

7.更強大的應用之函式下標

我們最後來試試更好玩的,用一個函式當table的下標:

function test()
 print("Hello Table");
end

local a = {[test] = 1}
print(a[test]);

定義了一個函式test,然後用test作為下標定義了table的一個元素,值為1。
這很奇怪不是嗎?但是有時候這樣確實很有用,這裡暫時不解釋。

OK,關於table的構造方式,暫時說這麼多,有點累了,晚安。