表格資料類型可以儲存多個類型的值,這些值不能是 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]) -- A stringprint(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 循環。由於數組具有數值索引,您也可以使用從 1 到數組長度 (#array) 的數字 for 循環。
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
插入項目
有兩種內建方法可以將項目插入到 數組 的 末尾:
- 將數組和項目值的引用傳遞給 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]) -- New stringprint(testArray[4]) -- Another new string
要在數組的開始和結束之間插入項目,請將位置值作為 table.insert() 的第二個參數。這將插入新項目並將後面的項目向上推一個索引位置。
local testArray = {"First item", "Next item"}table.insert(testArray, 2, "NEW ITEM #2")print(testArray[1]) -- First itemprint(testArray[2]) -- NEW ITEM #2print(testArray[3]) -- Next item
移除項目
要從數組中移除項目,請使用 table.remove()。這將移除指定位置的項目並將任何後續項目向後移動一個索引位置。
local testArray = {"First item", "Next item", "Last item"}table.remove(testArray, 2)print(testArray[1]) -- First itemprint(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"]) -- Block-- 或者使用 . 來索引沒有空格的字串鍵print(testDictionary.partType) -- Block-- 對於非字串鍵省略引號print(testDictionary[part]) -- true
寫入字典
要定義或重寫新的或現有的字典鍵的值,請在方括號中聲明鍵名稱 ([key]) 或者,如果鍵是一個字串,請使用 (.key),然後加上 = 和該值:
local testDictionary = {fruitName = "Lemon",sour = true}-- 更改現有鍵的值testDictionary["fruitName"] = "Cherry"testDictionary.sour = false-- 插入新的鍵值對testDictionary.fruitCount = 10print(testDictionary.fruitName) -- Cherryprint(testDictionary.sour) -- falseprint(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 --> 嘗試修改只讀表格
深凍結
要凍結一個內部有嵌套表格的更複雜的表格,使用類似於以下的遞歸函數:
local function deepFreeze(target)
-- 淺凍結該表格
table.freeze(target)
-- 檢查表格的每個鍵並在它是表格時凍結它
for _, value in target do
-- 確保值沒有被凍結;如果已經凍結,將發生錯誤
if type(value) == "table" and table.isfrozen(value) == false then
deepFreeze(value)
end
end
end
有了這個函數,您可以如下深凍結一個表格:
local target = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}deepFreeze(target)target.playerInfo.playerID = 1 --> 嘗試修改只讀表格