表格 (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)

results matching ""

    No results matching ""