表格 (Table)
table
是 Lua 的資料型態,用來將相似或有關連的資料整理在一起。Lua 支援兩種表格類型
以數字 (number) 作為索引的表格,類似傳統的一為陣列。 以字串 (string) 作為索引的表格,類似其他語言中的 hash table 或是 dictionary。
數字索引表格 (Numerically Indexed Table)
以下的 table 便是以數字做為索引
local myTable = {} -- An empty table
local myTable = { 1, 3, 5, 7, 9 } -- A table of numbers
local cityList = { "Palo Alto", "Austin", "Raleigh", "Topeka" } -- A table of strings
local mixedList = { "Cat", 4, "Dog", 5, "Iquana", 12 } -- A mixed list of strings and numbers
print( myTable[ 3 ] ) -- prints 5
myTable[ 3 ] = 100 -- You can set a table cell's value via its index number
print( myTable[ 3 ] ) -- prints 100
你可以透過 ’#’ 得知該表格有多少成員。
1 print( #cityList ) -- prints 4
2 cityList[ #cityList + 1 ] = "Moscow" -- Add a new entry at the end of the list
注意數字索引表格的第一個成員是用 1 去存取而非 0。
關鍵字索引表格 (Key Indexed Table)
透過關鍵字作為索引的表格透過類似的方式運作,不同的是你必須使用 key-value pairs:
local myCar = {
brand="Toyota",
model="Prius",
year=2013,
color="Red",
trimPackage="Four",
["body-style"]="Hatchback"
}
你可以透過 ‘.’ 或是中括弧指定 Key 去存取表格成員,如果 Key 中包含特殊字元例如 body-style,那你只能使用中括弧 ( [ ] ) 去存取或定義:
print( myCar.brand )
print( myCar[ "year" ] )
print( myCar[ "body-style" ] )
Lua 並不支援多維陣列,但你可以讓表格成為表格的成員之一,以模擬多維陣列:
local grid = {}
grid[ 1 ] = {}
grid[ 1 ][ 1 ] = "O"
grid[ 1 ][ 2 ] = "X"
grid[ 1 ][ 3 ] = " "
grid[ 2 ] = {}
grid[ 2 ][ 1 ] = "X"
grid[ 2 ][ 2 ] = "X"
grid[ 2 ][ 3 ] = "O"
grid[ 3 ] = {}
grid[ 3 ][ 1 ] = " "
grid[ 3 ][ 2 ] = "X"
grid[ 3 ][ 3 ] = "O"
表格也可包含使用關鍵字索引的表格:
local carInventory = {}
carInventory[1] = {
brand="Toyota",
model="Prius",
year=2013,
color="Red",
trimPackage="four",
["body-style"]="Hatchback"
}
carInventory[2] = {
brand="Ford",
model="Expedition",
year=1995,
color="Black",
trimPackage="XLT",
["body-style"]="wagon"
}
for i = 1, #carInventory do
print( carInventory[i].year, carInventory[i].brand, carInventory[i].model )
end
數字索引的表格可透過一般的 for
迴圈遍歷每一個成員,然而關鍵字索引表格則需要搭配 piar
,才可以遍歷其中的每一個成員:
for key, value in pairs( myCar ) do
print( key, value )
end
表格內的函式(functions in table)
function 內的成員可以是函式,以下的範例在 person
表格內建立新成員 getAge()
,獲得該表格的屬性:age
。
local person = {}
person.age = 18
person.getAge = function()
return person.age
end
print(person.getAge())
在 lua 的開發過程中,為了將相似的功能存放在同一張表格,我們常常會需要在表格內建立能夠存取該表格的方法。除了用 .
定義成員函式,也可以用 :
:
function person:getSelfAge()
return self.age
end
使用 :
定義的成員函式,可以透過 self
存取定義自己的表格,也讓程式比較漂亮,更容易閱讀。此外要注意使用 :
定義的函式,也必須使用 :
呼叫。
print(person:getSelfAge())
其實使用使用 :
定義的函式,在 lua 內會解釋成多帶一個名為 self 參數的函式:
function person:getSelfAge()
return self.age
end
--is equal to
person.getSelfAge = fucntion(self)
return self.age
end
而使用 :
呼叫函式時,lua 會將第一個參數自動帶入定義該函式的表格:
person:getSelfAge()
--is equal to
person.getSelfAge(person)