之前對(duì)于Lua的研究都是紙上談兵,沒(méi)有真正的項(xiàng)目練手,現(xiàn)在公司的項(xiàng)目基本上都是用Lua開(kāi)發(fā),是時(shí)候補(bǔ)充一下我那蹩腳的Lua知識(shí)了。
基礎(chǔ)數(shù)據(jù)類型、表達(dá)式、循環(huán)結(jié)構(gòu)什么的我就不說(shuō)了,這么簡(jiǎn)單的東西說(shuō)了也要被大家噴。
今天我想說(shuō)說(shuō)table的幾種構(gòu)造方式。
0.Lua調(diào)試工具——LuaEditor
首先,如果你是第一次接觸Lua,請(qǐng)補(bǔ)充一下Lua的最基本之中的基礎(chǔ)語(yǔ)法(小若:O O!),然后下載一個(gè)LuaEditor工具,用來(lái)查看Lua執(zhí)行效果,當(dāng)然也可以調(diào)試,本篇內(nèi)容不解釋這個(gè)工具??梢园俣纫幌逻@個(gè)工具。
1.什么是table?
table是Lua最復(fù)雜最強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),Lua本身并不是面向?qū)ο笳Z(yǔ)言,但是對(duì)面向?qū)ο笾卸颈容^深的程序員,可以借助table”完美”地模擬面向?qū)ο缶幊?。最?jiǎn)單地,我們可以把table理解為數(shù)組,最復(fù)雜的,我們可以把table理解為”世間萬(wàn)物”,因?yàn)樗梢詣?chuàng)造出很多你想象不到的東西。一個(gè)字,自由度非常大~!(小若:一個(gè)字,你妹~?。?/p>
2.如何創(chuàng)建一個(gè)table?
創(chuàng)建table是一件很復(fù)雜的事情,不知道大家頂不頂?shù)米?,試試看,如下?br />
復(fù)制代碼 代碼如下:
local a = {}
這樣就創(chuàng)建了一個(gè)table了。
(小若:噗,真夠復(fù)雜的…啊,你妹啊,復(fù)雜你個(gè)頭?。?/p>
3.如何初始化一個(gè)table
嗷,雖然創(chuàng)建table已經(jīng)很復(fù)雜了,更復(fù)雜的還在后面,怎么初始化table?看看下面的代碼:
復(fù)制代碼 代碼如下:
local a = {["x"] = 12, ["mutou"] = 99, [3] = "hello"}
print(a["x"]);
在LuaEditor中創(chuàng)建一個(gè)lua文件,輸入以上代碼,保存,然后按F5運(yùn)行,我們將看到輸出窗口輸出了一個(gè)數(shù)字:12。
這挺神奇的,感覺(jué)就像是在定義數(shù)組,不是嗎?
table間的元素用逗號(hào)分隔,["x"] = 12代表構(gòu)造一個(gè)table元素,下標(biāo)為”x”,值為12。(小若:為毛數(shù)組下標(biāo)可以是字符串?)
嗷~!我就等旁白問(wèn)這個(gè)問(wèn)題,旁白你笨蛋啊,我只是說(shuō)table像數(shù)組,我沒(méi)有說(shuō)它就是數(shù)組,table支持幾乎是所有類型的下標(biāo),包括函數(shù)。
(小若:。。。以后我不會(huì)中計(jì)了,喵…)
4.有更簡(jiǎn)潔的方式
這種初始化方式看起來(lái)太復(fù)雜了,有沒(méi)有簡(jiǎn)單點(diǎn)的?看看下面的代碼:
復(fù)制代碼 代碼如下:
local a = {x = 12, mutou = 99, [3] = "hello"}
print(a["x"]);
運(yùn)行結(jié)果仍然是輸出12,也就是說(shuō),對(duì)于字符串下標(biāo),我們可以省略方框和雙引號(hào),但是數(shù)字下標(biāo)不可以,千萬(wàn)不要搞混了。
但是,a["x"]這種調(diào)用方式也很煩人不是嗎?程序員都很懶的,所以Lua支持一下這種方式的調(diào)用:
復(fù)制代碼 代碼如下:
local a = {x = 12, mutou = 99, [3] = "hello"}
print(a.x);
輸出結(jié)果仍然是12,也就是說(shuō),對(duì)于字符串下標(biāo),可以直接用a.x的形式調(diào)用,也是省略了方框和雙引號(hào),初始化和調(diào)用方式的規(guī)則一樣,這樣大家就不會(huì)搞混了,記住,是字符串下標(biāo)才這么做。
記住,是字符串下標(biāo)才這么做。
記住,是字符串下標(biāo)才這么做。(小若:你再說(shuō)一句試試,我保證以后不幫你吐槽。)
5.想要默認(rèn)數(shù)字索引怎么辦?
如果說(shuō),大家習(xí)慣了數(shù)組,用數(shù)字下標(biāo),又不想自己一個(gè)個(gè)數(shù)字地定義,比如:
復(fù)制代碼 代碼如下:
local a = {[1] = 12, [2] = 43, [3] = 45, [4] = 90}
沒(méi)關(guān)系,Lua又為愛(ài)偷懶的程序員提供了一招,如下:
復(fù)制代碼 代碼如下:
local a = {12, 43, 45, 90}
print(a[1]);
看看a[1]輸出的值是不是12?(小若:但是12的下標(biāo)應(yīng)該是0啊,數(shù)組下標(biāo)是從0開(kāi)始計(jì)算的)
再一次警告旁白,table類似數(shù)組,但它絕對(duì)不是數(shù)組。
table默認(rèn)的第一個(gè)索引下標(biāo)是1,并且很多相關(guān)的函數(shù)也假設(shè)table的第一個(gè)索引下標(biāo)為1,所以大家最好遵守這個(gè)規(guī)則。
6.更強(qiáng)大的應(yīng)用之table的table
table什么都能放,當(dāng)然也能放table了,如下:
復(fù)制代碼 代碼如下:
local a = {
{x = 1, y = 2},
{x = 3, y = 10}
}
我們定義了一個(gè)table,命名為a,table有兩個(gè)元素,分別是兩個(gè)沒(méi)有名字的table,根據(jù)第5條所說(shuō)的規(guī)則,沒(méi)有顯示指定下標(biāo),那Lua就會(huì)默認(rèn)給table的元素賦予下標(biāo)(從1開(kāi)始)。
因此,a的第一個(gè)元素就是{x = 1, y = 2},調(diào)用a的第一個(gè)元素的方式為:a[1]
由于a[1]又是一個(gè)table,所以,再次調(diào)用table的x下標(biāo)的值:a[1].x
這樣就OK了。
7.更強(qiáng)大的應(yīng)用之函數(shù)下標(biāo)
我們最后來(lái)試試更好玩的,用一個(gè)函數(shù)當(dāng)table的下標(biāo):
復(fù)制代碼 代碼如下:
function test()
print("Hello Table");
end
local a = {[test] = 1}
print(a[test]);
定義了一個(gè)函數(shù)test,然后用test作為下標(biāo)定義了table的一個(gè)元素,值為1。
這很奇怪不是嗎?但是有時(shí)候這樣確實(shí)很有用,這里暫時(shí)不解釋。
OK,關(guān)于table的構(gòu)造方式,暫時(shí)說(shuō)這么多,有點(diǎn)累了,晚安。
您可能感興趣的文章:- Lua的table庫(kù)函數(shù)insert、remove、concat、sort詳細(xì)介紹
- Lua中對(duì)table排序?qū)嵗?/li>
- Lua中遍歷數(shù)組和table的4種方法
- Lua中的table學(xué)習(xí)筆記
- Lua中使用table.concat連接大量字符串實(shí)例
- Lua中的table淺析
- Lua判斷Table是否為空的方法(空的table即{})
- Lua中使用table實(shí)現(xiàn)的其它5種數(shù)據(jù)結(jié)構(gòu)
- 獲取Lua表結(jié)構(gòu)(table)數(shù)據(jù)實(shí)例
- 深入談?wù)刲ua中神奇的table