iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Software Development

30天 Lua重拾筆記系列 第 21

【30天Lua重拾筆記20】基礎3: 複合結構 - table

本文同步發表於個人網站

Lua只有一個原生的複合結構 -- table。實際上陣列是table的特例。

陣列是table的特例

arr = {1,2,3,4}
print(type(arr)) --> table

建立表(table)

table對應於:

程式語言 型別
python dict
js object or Map

這個結構幾乎是現代高階語言必備的基礎。其又稱作hash-table,是一個鍵值對(key/value)的結構。在Lua之中,其key可以是除了nilNaN(Not a Number)以外的任何型別。

key值值域

obj = {} -- 建立一個空表
obj[1] = 1 -- 整數是合法的key值
obj[1.0] = 2 -- 浮點數是合法的key值
obj["string"] = 1 -- 字串是合法的key值
obj[math.huge] = 1 -- inf是合法的key值

--[[ 
要注意的是 obj[1] 和 obj[1.0]相同
其obj[1]和obj[1.0]最終值為2
--]]

----------------

print(obj[nil]) --> nil
obj[nil] = 1 --> Error: nil不是合法的key值,儘管取值不會出錯

print(obj[0/0]) --> nil
print(0/0) --> -nan
obj[0/0] = 1 --> Error: NaN不是合法的key值

value值值域

其value可以是nil以外的值。

nil表示該key不存在,亦可視為刪除該key

obj[1] = nil -- 刪除`obj[1]`
print(obj[1]) --> nil --表示obj[1]不存在

初始化

除了建立空表,可以使用下面方式初始化table

person = {
  ["name"] = "Bob",
  ["age"] = 25,
}

如果是從1開始的連續整數,其行為大體與陣列相同:

arr = {
  [1] = 1,
  [2] = 2,
  [3] = 3,
  [4] = 4,
}

語法糖

如果key值是字串類型,且其開頭不為數字,可以簡化成下面寫法:

person = {
  name = "Bob",
  age = 25,
}

取值

取值與Python、JS、C很像,使用下標運算:

print(person["name"])

語法糖

如果是字串key值,可以簡化成:

print(person.age)

實際上對於值類型為function還有一種語法糖,會在物件導向介紹。


上一篇
【30天Lua重拾筆記19】基礎3: 陣列從1開始
下一篇
【30天Lua重拾筆記21】基礎3: 再看pairs, ipairs
系列文
30天 Lua重拾筆記36

尚未有邦友留言

立即登入留言