桌子資料類型可以存儲多種類型不是 nil 的值,包括 booleans、1> 數量1>、4> 字串4>、7> 函數7> 和其他桌子。用 0> 桿體括號 ( 3> )3>):
-- 建造"t"變量的空桌子local t = {}print(t) -- {}
您可以使用表作為 陣列 或 字典 。陣列使用排序列表的數字作為索引,但字典可以有數字、字串和對象作為索引。
有關使用表作業的內置功能的更多資訊,請參閱 table 圖書館。
陣列
陣列 是由特殊權限的玩家組成的資料集。陣列有助於存儲資料集,例如玩家群組。
建立陣列
若要使用 Luau 桌子創建陣列,請以連號分開的順序宣告值。
-- 建造三個項目的陣列local testArray = {"A string", 3.14159, workspace.Camera}print(testArray)
從陣列閱取
要從陣列中閱取,請在其參考後加上兩個方形括號,並指定元素內的索引數([pos]):
-- 建造三個項目的陣列local testArray = {"A string", 3.14159, workspace.Camera}print(testArray[1]) -- 一個字串print(testArray[2]) -- 3.14159print(testArray[3]) -- Camera
擷取陣列的資料
要在索引中定義或重寫一個陣列的值,請在方塊內加入 [index] 與 = 之後的值,並且將值指定為:
local testArray = {"A string", 3.14159, workspace.Camera}testArray[2] = 12345testArray[4] = "New string"print(testArray[2]) --12345print(testArray[4]) -- New string
在陣列上迭代
要在陣列上重複,您可以使用 for 循環。因為陣列有數量索引,您也可以使用 for 數量索引從 1 到陣列長度 ( 2># array2> )。
local testArray = {"A string", 3.14159, workspace.Camera, "New string"}-- 使用一般循環for index, value in testArray doprint(index, value)end-- 使用 array 長度操作器 (#) 來重複for index = 1, #testArray doprint(index, testArray[index])end-- [[ 輸出結果:1 A string2 3.141593 Camera4 New string1 A string2 3.141593 Camera4 New string]]
插入項目
有兩種內置方法可以將一個項目插入 end 的一個陣列的 end:
- 通過參考陣列和項目值傳递給 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
典藏
字典是擴展陣列的一個延伸。字典存儲一組鑰匙值對,其中鑰匙可以是任何數字、字串或對物件。
建立字典
要建立字典表,定義每個 鍵 之後的 = 和 value 。用分號分開每個鍵值對,並使用 2> 值2> 。
local testDictionary = {FruitName = "Lemon",FruitColor = "Yellow",Sour = true}
字典的鑰匙可以是數字、字串和對象。例如,鑰匙可以也是一個 Instance 。要使用對象作為鑰匙,請在方塊內 ( [key] 宣告鑰匙:
local part = Instance.new("Part")local testDictionary = {PartType = "Block",[part] = true}
從字典閱取
要從字典閱取,請在其參考後加上兩個括號,並指定鑰匙名。直接使用引號 (["key"] )或變量值 ( [鍵ey>5>]) 來參考字串。
local part = Instance.new("Part")local testDictionary = {PartType = "Block",[part] = true}-- 包括對字串鑰匙的引言print(testDictionary["PartType"]) -- 方塊-- 省略非字串鑰匙的引號print(testDictionary[part]) -- true
寫作詞典
要定義或重寫新或現有典鍵的值,請在括號 ( [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
在字典上迭代
要在字典上重複,請使用 pairs() 函數在 for 循環中:
local testDictionary = {FruitName = "Lemon",FruitColor = "Yellow",Sour = true}for key, value in pairs(testDictionary) doprint(key, value)end-- [[ 輸出結果:FruitName LemonSour trueFruitColor Yellow]]
移除鑰匙值對
要從字典中移除或清除鑰匙值對,將其值設為 nil 的鑰匙。
local testDictionary = {FruitName = "Lemon",FruitColor = "Yellow",Sour = true}testDictionary["Sour"] = nilfor key, value in pairs(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)
深度複製
要複製內有重疊桌子的更複雜的表,您需要使用類似以追蹤中的 recursive 函數:
-- 一種用於深度複製表的函數
local function deepCopy(original)
-- 為複製品定義新表
local copy = {}
-- 從原始桌子複製
for key, value in original do
-- 如果值的類型是欄表,請將其深度複製到鑰匙 (索引)
-- 否則 (或) 類型不是表,而是要將預設值指定為索引
copy[key] = type(value) == "table" and deepCopy(value) or value
end
-- 返回深度複製桌的最終複製品
return copy
end
有了功能,您可以作出如下深度複製:
local original = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}local clone = deepCopy(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
深度凍結
要結合複雜表中的擷取函數,使用類似以追蹤中的 recursive 函數:
local function deepFreeze(target)
-- 將表淺凍結
table.freeze(target)
-- 檢查表中的每個鑰匙,並將其凍結,如果是桌子
for _, v in target do
if type(v) == "table" 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