隨手扎
【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可以是除了nil
和NaN
(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
還有一種語法糖,會在物件導向介紹。