表 資料類型可儲存任何類型中不包含nil的多個值,包括二元運算符、數字、字串、函數和其他表。使用捲髮括號構建表():
-- 建造一個空表,指派給變量「t」local t = {}print(t) -- {}
您可以使用表作為 陣列 或 辭典。陣列使用排序列表的數字作為索引,但辭典可以有數字、字串和物件作為索引。
有關使用表的內置功能的更多信息,請參閱 table 圖書館。
陣列
陣列 是一個排序列的值。陣列有用於儲存數據集,例如一群擁有特殊許可的玩家。
創建陣列
若要使用 Luau 表創建一個陣列,請宣言值在順序排列的情況下,以逗號分開。
-- 建立一個包含三項的陣列local testArray = {"A string", 3.14159, true}print(testArray)
從數組讀取
要從陣列閱讀,請在其參考後添加一對方括號,並指定內部元素的索引號([pos]):
-- 建立一個包含三項的陣列local testArray = {"A string", 3.14159, true}print(testArray[1]) -- 一個字串print(testArray[2]) -- 3.14159print(testArray[3]) -- true
寫入陣列
若要在指數定義或重寫陣列的值,請在括號中宣言指數號 ( [index] ) 之後由 = 和值:
local testArray = {"A string", 3.14159, true}testArray[2] = 12345testArray[4] = "New string"print(testArray[2]) --12345print(testArray[4]) -- New string
在陣列上迭代
若要在陣列上循環,您可以使用 for 循環。因為陣列有數字指標,你也可以使用數字 for 循環從 1 到陣列長度(#array)。
local testArray = {"A string", 3.14159, true, "New string"}-- 使用一般循環重複for index, value in testArray doprint(index, value)end-- 使用陣列長度運算符重複 (#)for index = 1, #testArray doprint(index, testArray[index])end
插入項目
有兩種內置方法可將項目插入到 陣列的結尾 :
- 傳送參考到 array 和物件值給 Luau 的 table.insert() 函數。
- 使用 array[#array+1] 語法將新項目添加到陣列中。
local testArray = {"A string", 3.14159}table.insert(testArray, "New string")testArray[#testArray+1] = "Another new string"print(testArray[3]) -- 新字串print(testArray[4]) -- Another new string
若要在陣列的開始和結束之間插入一個項目,請將位置值作為 table.insert() 的第二個參數包含在內。這會插入新項目並將下列項目推到一個索引位置。
local testArray = {"First item", "Next item"}table.insert(testArray, 2, "NEW ITEM #2")print(testArray[1]) -- 第一個項目print(testArray[2]) -- 新項目 #2print(testArray[3]) -- Next item
移除項目
若要從陣列中移除一個項目,請使用 table.remove() 。這會移除指定位置的項目,並將任何後續項目移回一個索引位置。
local testArray = {"First item", "Next item", "Last item"}table.remove(testArray, 2)print(testArray[1]) -- 第一個項目print(testArray[2]) -- Last item
辭典
辭典是陣列的擴展。辭典儲存一組鑰匙值對,其中鑰匙可以是任何數字、字串或對象。
創建辭典
要創建一個字典表,定義每個 鍵 跟隨 = 和 值 。用逗號分開每對鍵值對:
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}
辭典的鑰匙可以是數字、字串和物件。例如,鑰匙也可能是 Instance 。要使用對象作為鑰匙,請在方括號中宣言鑰匙([key]):
local part = Instance.new("Part")local testDictionary = {partType = "Block",[part] = true}
從辭典讀取
要從辭典閱讀,請在其參考後添加一對括號並指定鑰匙名稱。直接使用 ["key"] 或 .key 來參考字串鑰匙,或者使用變量值 [key] 。
local part = Instance.new("Part")local testDictionary = {partType = "Block",[part] = true}-- 包括對字串鑰匙的引用print(testDictionary["partType"]) -- 方塊-- 或使用 . 來索引沒有空格的字串鍵print(testDictionary.partType) -- 方塊-- 忽略非字串鍵的引用符print(testDictionary[part]) -- true
寫入辭典
要定義或重寫新或現有字典鑰匙的值,請在括號 ( [key] ) 中宣言鑰匙名稱,或如果鑰匙是字串,請使用 ( .key ) 之後的 = 和值:
local testDictionary = {fruitName = "Lemon",sour = true}-- 變更現有鍵值testDictionary["fruitName"] = "Cherry"testDictionary.sour = false-- 插入新的鑰匙值對testDictionary.fruitCount = 10print(testDictionary.fruitName) -- 櫻桃print(testDictionary.sour) -- 否print(testDictionary.fruitCount) -- 10
在辭典上迭代
要循環過辭典,請使用 for 循環:
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}for key, value in testDictionary doprint(key, value)end--[[ 結果輸出:fruitName Lemonsour truefruitColor Yellow]]
移除鑰匙值對
要從辭典中移除或清除鑰匙值對,將其值設為鑰匙的 nil 。
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}testDictionary.sour = nilfor key, value in testDictionary doprint(key, value)end--[[ 結果輸出:fruitName LemonfruitColor Yellow]]
表作為參考
如果您將表存儲在新變量中,Luau不會創建該表的副本。相反,變量變成 參考 或指向原始表的指標。對表的任何參考反映了原始表的任何變更:
local originalArray = {10, 20}local arrayReference = originalArrayprint("Original:", originalArray[1], originalArray[2])print("Reference:", arrayReference[1], arrayReference[2])-- 變更原始數組中的值originalArray[1] = 1000originalArray[2] = 2000print("Reference:", arrayReference[1], arrayReference[2])--[[ 結果輸出:Original: 10 20Reference: 10 20Reference: 1000 2000]]
複製表
淺複製人
若要複製任何巢穴表,Luau 提供 table.clone() 方法。
local original = {key = "value",engine = "Roblox",playerID = 505306092}local clone = table.clone(original)
深度複製
若要複製包含內嵌表的更複雜的表,你需要使用類似於下列的递遞函數:
-- 用於深度複製表的功能
local function deepClone(original)
-- 為複製新表定義
local clone = table.clone(original)
-- 循環通過原始表來檢查表值
-- 如果表被找到為值,深度複製到鑰匙(索引)
for key, value in original do
if type(value) == "table" then
clone[key] = deepClone(value)
end
end
-- 返回深複製的表的最終版本
return clone
end
有了功能在位,您可以按照以下步驟進行深度複製:
local original = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}local clone = deepClone(original)
凍結表格
凍結一個表使其變得只能閱讀,這對創建不想要更改的常數值很有用。凍結是永久的;沒有「解凍」或「解凍」方法。要檢查表是否被凍結,請使用 table.isfrozen() 。
淺凍結
若要凍結任何巢穴表,Luau 提供 table.freeze() 方法。
local target = {key = "value",engine = "Roblox",playerID = 505306092}table.freeze(target)target.playerID = 1 --> attempt to modify a readonly table
深凍結
要凍結包含嵌套表的更複雜的表,請使用類似於下列的递归函數:
local function deepFreeze(target)
-- 淺凍表
table.freeze(target)
-- 檢查表的每個鍵並凍結它,如果是表
for _, value in target do
-- 請確保值未凍結;如果已凍結,則會發生錯誤
if type(value) == "table" and table.isfrozen(value) == false then
deepFreeze(v)
end
end
end
有了功能在位,您可以深凍一個表如下:
local target = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}deepFreeze(target)target.playerInfo.playerID = 1 --> attempt to modify a readonly table