Lua 中 Table 表 在做數(shù)組和做字典時的用法

在corona sdk里,是用lua去做所有事情的。因此,了解lua的特性和API非常重要。

什么是Table?

如果你有其他語言的開發(fā)經(jīng)驗,你應該知道2種數(shù)據(jù)類型,那就是數(shù)組和集合,在lua中,table就是數(shù)組和集合的混合物(這也是為什么table如此強大的原因)。

如果corona sdk是你第一次開始接觸編程,你可能認為table就是一個表,或者梳妝臺,哈哈。

梳妝臺的抽屜就類似于“key”,你放在里面的東西就是“value”。然后,lua table和真正的梳妝臺不同的是,梳妝臺抽屜里面還可以放置梳妝臺。

在我們繼續(xù)之前,我認為你已經(jīng)了解了如下內(nèi)容:

1)table里保存數(shù)據(jù),數(shù)據(jù)可以是任何類型,包括function。

2)table里也可以保存table

3)key代表數(shù)據(jù)存儲的位置(如抽屜)

4)value就是用特定的key存儲的數(shù)據(jù)

這可能就是lua table的基本解釋了,下面我講說一說在lua中如何定義table,如何對table進行存儲和檢索,以及如何使用“for”來循環(huán)表里table。

定義table

當然,定義,我的意思是創(chuàng)建一個表,所以你可以任何時候用它?,F(xiàn)在,我將重點放在創(chuàng)建一個沒有數(shù)據(jù)的空白表。這將是我們的品牌新的梳妝臺:

local myTable = {}

在lua中定義table和定義其他變量一樣,就是一個等號,左邊是變量名,右邊是存儲的數(shù)據(jù)。table是用“{”“}”來定義存儲的數(shù)據(jù)。這種表達方式在你使用一些函數(shù)的時候經(jīng)??吹健,F(xiàn)在你有一個空白表(mytable),接下來,我將通過不同的方式存儲數(shù)據(jù)到一個表中,以及如何檢索數(shù)據(jù)。

table數(shù)組

下面3種方法來定義table都是合法的,實際上他們都在做同樣的事情。3和4的其實是一樣的,只是告訴你在這里換行是沒有必要的,尤其把table作為函數(shù)參數(shù)時經(jīng)常用到。

方法1:

local colorTable =?{}

colorTable[1] = "blue"

colorTable[2] = "red"

colorTable[3] = "yellow"

colorTable[4] = "green"

colorTable[5] = "purple"

print(?colorTable[3] ) -- output: "yellow"

方法2:

local colorTable?= {

[1] = "blue",

[2] = "red",

[3] = "yellow",

[4] = "green",

[5] = "purple"

}

print( colorTable[3] ) -- output: "yellow"

方法3:

local colorTable = {

"blue",

"red",

"yellow",

"green",

"purple"

}

print( colorTable[3] ) -- output: "yellow"

方法4:

local colorTable = { "blue", "red", "yellow", "green", "purple" }

print( colorTable[3] ) -- output: "yellow"

上面的例子都在做同樣一件事情。作為corona的開發(fā)者,你必須熟悉每一種表示方法,因為你可以完全根據(jù)個人喜好來使用table。當table僅僅是做為一個數(shù)值數(shù)組時,key都是數(shù)值(和其他語言不同的是,是從1開始而不是0)。例如在每個print語句(段)告訴您如何使用放在方括號(“[]”)之間的索引號來訪問表中的數(shù)據(jù)。

要獲得使用數(shù)字key的table的元素總數(shù),你可以這樣做在表的名稱前面使用'#'標志,就像這樣:

print( #colorTable ) -- output: 5

table集合

Lua中的table,也可以像其他編程語言的dictionary集合(也稱為“關(guān)聯(lián)數(shù)組”)。

下面是一個像dictionary一樣行為的表的例子:

local colorTable = {

sky = "blue",

grass = "green",

water = "blue",

lava = "red"

}

colorTable.dirt = "brown"

-- Accessing the data:

print( colorTable.grass ) -- output: green

print( colorTable["dirt"] ) -- output: brown

在上面的例子,你可以看到?jīng)]有定義數(shù)字鍵,這就是主要區(qū)別。有時候,使用這種方法可以使得數(shù)據(jù)便于識別和訪問。使用key而不是數(shù)字索引,是為了更準確(當作為集合使用時,數(shù)據(jù)的實際存儲位置和你定義時的位置可能不一致)。你可以使用下面兩種方法來訪問數(shù)據(jù):

colorTable["sky"]

-- and...

colorTable.sky

上面的2種方法顯示了2種不同的方法來訪問同一個數(shù)據(jù)。和使用數(shù)字key一樣,你也可以添加key,就像定義之后再添加“dirt”一樣。

lua中的table可以同時表示數(shù)組和集合,你可以混合使用數(shù)字key和字符串key,但是這會非常混亂,我們建議你同時只用來表達一個類型的數(shù)據(jù)。

數(shù)據(jù)類型

如上所述,table可以用key來存儲任何數(shù)據(jù)類型。這意味著你可以存儲額外的表,函數(shù)和引用函數(shù)的表,以及更常見的數(shù)字和字符串。

這里有一個如何在表中存儲一個表的例子(以及如何訪問數(shù)據(jù)):

local people = {

{ name="Bob", age=32, gender="male" },

{ name="Jane", age=29, gender="female" }

}

print( people[1].name )

-- output: Bob

print( people[2]["gender"] )

-- output: female

table中可以存儲任意個table,沒有限制。

下面,另一個稍微復雜的數(shù)據(jù)table,你會看到在一個表中利用一個key來存儲function的引用。示例:

local function helloWorld()

print( "Hello World!" )

end

local myTable = {

name = "Bob",

func = helloWorld

}

myTable.func() -- output: Hello World!

----------

local function helloWorld()

print( "Hello World!" )

end

local myTable = { 100, 100, helloWorld, true }

myTable[3]() -- output: Hello World!

下面將展示如何在一個table里存儲function的實際功能。

local myTable = { 100, 100, function() print( "Hello World!" ); end, true }

myTable[3]() -- output: Hello World!

你現(xiàn)在可能已經(jīng)明白了,lua table里面的key和lua的其他變量沒有任何區(qū)別,可以存儲任何類型數(shù)據(jù)。這樣是最好理解的方法了。

當table越來越大越來越混亂時,我建議里可以用逗號為間隔來看待。可能會比較清晰。

table和循環(huán)

如何迭代表數(shù)據(jù)是使用table最常見的功能了,下面展示如何遍歷一個使用數(shù)字key的table:

local myTable = { "blue", "red", "yellow", "green", "white", "purple" }

for i=1,#myTable do

print( myTable[i] )

end

-- OUTPUT:

blue

red

yellow

green

white

purple

上面的代碼,我想已經(jīng)很清楚的說明了一切。遍歷數(shù)字key的表的內(nèi)容是相當平滑的。

但是,如果你的表的鍵名,而不是數(shù)字?

為此,我們將使用pairs()函數(shù)(它返回兩個變量):

local colorTable = {

sky = "blue",

grass = "green",

water = "blue",

lava = "red",

dirt = "brown"

}

for key,value in pairs(colorTable) do

print( key, value )

end

-- OUTPUT:

sky blueg

rass green

water blue

lava red

dirt brown

如果一個table使用字符串來表示key,那么你就不能簡單的使用索引來訪問(上面說過當用字符串key來存儲時,數(shù)據(jù)的實際存儲順序和你定義它時的可能不一致,所以不能直接用數(shù)字索引)。相反,你使用了pairs()來遍歷沒有使用數(shù)字key的table(就像上面的例子中看到)。

為了獲得更完整,全面了解Lua中的表,請訪問以下兩個網(wǎng)頁(兩者都是我學習的時候我非常有用):

http://www.lua.org/pil/2.5.html

http://lua.gts-stolberg.de/en/Tables.php

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容