表格

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

資料類型可儲存任何類型中不包含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.14159
print(testArray[3]) -- true

寫入陣列

若要在指數定義或重寫陣列的值,請在括號中宣言指數號 ( [index] ) 之後由 = 和值:


local testArray = {"A string", 3.14159, true}
testArray[2] = 12345
testArray[4] = "New string"
print(testArray[2]) --12345
print(testArray[4]) -- New string

在陣列上迭代

若要在陣列上循環,您可以使用 for 循環。因為陣列有數字指標,你也可以使用數字 for 循環從 1 到陣列長度(#array)。


local testArray = {"A string", 3.14159, true, "New string"}
-- 使用一般循環重複
for index, value in testArray do
print(index, value)
end
-- 使用陣列長度運算符重複 (#)
for index = 1, #testArray do
print(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]) -- 新項目 #2
print(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 = 10
print(testDictionary.fruitName) -- 櫻桃
print(testDictionary.sour) -- 否
print(testDictionary.fruitCount) -- 10

在辭典上迭代

要循環過辭典,請使用 for 循環:


local testDictionary = {
fruitName = "Lemon",
fruitColor = "Yellow",
sour = true
}
for key, value in testDictionary do
print(key, value)
end
--[[ 結果輸出:
fruitName Lemon
sour true
fruitColor Yellow
]]

移除鑰匙值對

要從辭典中移除或清除鑰匙值對,將其值設為鑰匙的 nil


local testDictionary = {
fruitName = "Lemon",
fruitColor = "Yellow",
sour = true
}
testDictionary.sour = nil
for key, value in testDictionary do
print(key, value)
end
--[[ 結果輸出:
fruitName Lemon
fruitColor Yellow
]]

表作為參考

如果您將表存儲在新變量中,Luau不會創建該表的副本。相反,變量變成 參考 或指向原始表的指標。對表的任何參考反映了原始表的任何變更:


local originalArray = {10, 20}
local arrayReference = originalArray
print("Original:", originalArray[1], originalArray[2])
print("Reference:", arrayReference[1], arrayReference[2])
-- 變更原始數組中的值
originalArray[1] = 1000
originalArray[2] = 2000
print("Reference:", arrayReference[1], arrayReference[2])
--[[ 結果輸出:
Original: 10 20
Reference: 10 20
Reference: 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