在 Lua 中,table 的鍵幾乎可以是任何類型,但有幾個重要的規則和最佳實踐需要了解。
1. 主要鍵類型
(1)?字符串 (string)
這是最常見、最推薦的鍵類型。
local person = {name = "Alice", -- 等同于 ["name"] = "Alice"["age"] = 30 -- 當鍵名復雜時,必須用方括號
}
(2)?數字 (number)
數字鍵通常用于實現 “數組”。Lua 數組默認從索引?1
?開始。
local fruits = {"apple", "banana"} -- fruits[1], fruits[2]
fruits[100] = "orange" -- 也可以使用任意數字作為鍵
???注意:數字?0
?也是一個有效的鍵,但它不屬于默認的數組部分。
(3)?布爾值 (boolean)
布爾值?true
?和?false
?也可以作為鍵。
local settings = {[true] = "開啟狀態",[false] = "關閉狀態"
}
(4)?表 (table) / 函數 (function) / 用戶數據 (userdata)
這些都是 “引用類型”,只有當它們是同一個對象時,才會被視為同一個鍵。
local t1 = {}
local t2 = {}
local t3 = t1local cache = {[t1] = "這是t1",[function() end] = "這是一個匿名函數"
}print(cache[t3]) -- 輸出 "這是t1",因為 t3 和 t1 是同一個表
print(cache[t2]) -- 輸出 nil,因為 t2 是另一個不同的表
2. 兩個關鍵規則
nil
?鍵是無效的
將?nil
?賦值給一個鍵會刪除該鍵值對。local t = {key = "value"} t.key = nil -- t 現在變成了空表 {}
數字?
0
?和字符串?"0"
?是不同的鍵
Lua 會區分鍵的類型。local t = {[0] = "數字0", ["0"] = "字符串0"} print(t[0]) -- 輸出 "數字0" print(t["0"]) -- 輸出 "字符串0"
3. 遍歷與鍵類型
不同的遍歷方式會處理不同類型的鍵:
ipairs
: 只遍歷連續的、從 1 開始的數字鍵。pairs
: 遍歷所有類型的鍵(除了?nil
)。
總結與建議
鍵類型 | 描述 | 推薦場景 |
---|---|---|
字符串 | 最常用,可讀性好,性能穩定 | 首選。用于表示配置、對象屬性等。 |
數字 | 用于實現數組和有序列表 | 需要按順序訪問一組數據時使用。 |
布爾值 | 只有兩個可能的值 | 適用于簡單的二態配置。 |
引用類型 | (表 / 函數等)用作臨時緩存的鍵 | 高級用法,如實現備忘錄模式或對象唯一標識。 |
在 Lua 中初始化 table 主要有以下幾種方式,從簡單到復雜排列:
1. 創建空表
最基礎的方式,創建一個沒有任何元素的 table。
local t = {}
2. 列表式初始化
用于創建數組或線性表,索引會自動從 1 開始遞增。
local fruits = {"apple", "banana", "orange"}
-- fruits[1] = "apple", fruits[2] = "banana"
3. 鍵值對式初始化
用于創建字典或映射,可以自定義任何類型的鍵(通常是字符串)。
local person = {name = "Alice",age = 30,isStudent = false
}
-- 等同于 person["name"] = person.name = "Alice"
4. 混合初始化
在一個 table 中同時包含列表部分和鍵值對部分。
local data = {-- 列表部分"Lua", "Python", "JavaScript",-- 鍵值對部分creator = "Guido van Rossum", -- 注意:這里是個小陷阱!rating = 9.5
}
?? 重要陷阱:在混合初始化中,所有列表項的自動索引會在所有鍵值對之前被分配。上面的例子中,data[1] = "Lua", data[2] = "Python", data[3] = "JavaScript"。
5. 計算式初始化
在初始化時,用方括號 [] 來包裹表達式,動態計算鍵名。這對于使用非字符串作為鍵或動態生成鍵名非常有用。
local key_name = "score"
local config = {["player-id"] = 12345, -- 使用特殊字符的字符串鍵[key_name] = 90, -- 使用變量作為鍵[os.time()] = "start" -- 使用函數調用結果作為鍵
}
6. 構造函數式初始化
通過在 table 構造器中調用函數,可以在創建 table 的同時執行復雜的初始化邏輯。
local function build_user(id)return {id = id,token = "token_" .. id}
endlocal user = build_user(101)
-- user = { id = 101, token = "token_101" }
這些初始化方式是 Lua 中非常基礎且重要的知識點。