Loại dữ liệu bảng có thể lưu trữ nhiều giá trị của bất kỳ loại nào không phải là , bao gồm booleans , số , chuỗi , chức năng và các bảng khác.Xây bảng với dấu ngoặc cuộn ( {} ):
-- Xây dựng một bảng trống được gán cho biến "t"local t = {}print(t) -- {}
Bạn có thể sử dụng một bảng như một array hoặc dictionary .Các mảng sử dụng danh sách được sắp xếp của các số làm chỉ mục, nhưng danh sách từ điển có thể có số, chuỗi và đối tượng làm chỉ mục.
Để biết thêm thông tin về chức năng tích hợp cho việc làm việc với bảng, xem thư viện table .
Mảng
Một 阵列 là một danh sách có trật tự của các giá trị.Các mảng hữu ích để lưu trữ các bộ sưu tập dữ liệu, chẳng hạn như một nhóm người chơi có quyền truy cập đặc biệt.
Tạo mảng
Để tạo một mảng bằng cách sử dụng bảng Luau, tuyên bố các giá trị theo thứ tự tuần tự, được tách bởi dấu phẩy.
-- Xây dựng một array với ba mụclocal testArray = {"A string", 3.14159, true}print(testArray)
Đọc từ mảng
Để đọc từ một mảng, thêm một cặp dấu ngoặc vuông sau tham chiếu của nó và xác định số chỉ mục của thành phần bên trong ( [pos] ):
-- Xây dựng một array với ba mụclocal testArray = {"A string", 3.14159, true}print(testArray[1]) -- Một chuỗiprint(testArray[2]) -- 3.14159print(testArray[3]) -- true
Viết vào mảng
Để xác định hoặc viết lại giá trị của một array tại một chỉ mục, tuyên bố số chỉ mục trong dấu ngoặc vuông ( [index] ) theo sau bởi = và giá trị:
local testArray = {"A string", 3.14159, true}testArray[2] = 12345testArray[4] = "New string"print(testArray[2]) --12345print(testArray[4]) -- New string
Lặp qua các mảng
Để lặp qua một mảng, bạn có thể sử dụng một vòng lặp for.Bởi vì các mảng có chỉ mục số, bạn cũng có thể sử dụng một vòng lặp số for từ 1 đến chiều dài của mảng ( #array ).
local testArray = {"A string", 3.14159, true, "New string"}-- Vòng lặp sử dụng lặp lại chungfor index, value in testArray doprint(index, value)end-- Lặp lại bằng cách sử dụng operator dài của mảng (#)for index = 1, #testArray doprint(index, testArray[index])end
Chèn vật phẩm
Có hai cách tích hợp để chèn một mục vào cuối của một mảng:
- Chuyển một tham chiếu đến mảng và giá trị của mục cho chức năng Luau's table.insert() .
- Thêm mục mới vào mảng bằng cách sử dụng syntax array[#array+1].
local testArray = {"A string", 3.14159}table.insert(testArray, "New string")testArray[#testArray+1] = "Another new string"print(testArray[3]) -- Chuỗi mớiprint(testArray[4]) -- Another new string
Để chèn một mục giữa đầu và cuối của một mảng, bao gồm một giá trị vị trí như là tham số thứ hai của table.insert() .Điều này chèn vật phẩm mới và đẩy các vật phẩm sau theo một vị trí chỉ mục.
local testArray = {"First item", "Next item"}table.insert(testArray, 2, "NEW ITEM #2")print(testArray[1]) -- Vật phẩm đầu tiênprint(testArray[2]) -- Vật phẩm mới #2print(testArray[3]) -- Next item
Loại bỏ các mục
Để xóa một mục khỏi một mảng, sử dụng table.remove() .Điều này xóa mục ở vị trí được chỉ định và di chuyển bất kỳ mục tiếp theo nào trở lại một vị trí chỉ mục.
local testArray = {"First item", "Next item", "Last item"}table.remove(testArray, 2)print(testArray[1]) -- Vật phẩm đầu tiênprint(testArray[2]) -- Last item
Từ điển
Danh sách từ điển là một mở rộng của mảng. Danh sách từ điển lưu một bộ các cặp chìa khóa-giá trị, trong đó các chìa khóa có thể là bất kỳ số, chuỗi hoặc đối tượng nào.
Tạo bản từ điển
Để tạo bảng từ điển, xác định mỗi chìa khóa theo sau bởi = và giá trị . Tách từng cặp chìa khóa-giá trị với một dấu phân cách:
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}
Các chìa khóa cho từ điển có thể là số, chuỗi và đối tượng.Ví dụ, một chìa khóa cũng có thể là Instance .Để sử dụng các đối tượng làm chìa khóa, tuyên bố chìa khóa trong dấu ngoặc vuông ( [key] ):
local part = Instance.new("Part")local testDictionary = {partType = "Block",[part] = true}
Đọc từ bách khoa toàn thư
Để đọc từ một từ điển, thêm một cặp ngoặc sau tên tham chiếu và xác định tên chìa khóa.Tham chiếu trực tiếp một chìa khóa dây bằng cách sử dụng ( ["key"] ) hoặc ( .key ), hoặc thay vào đó sử dụng giá trị biến ( [key] ).
local part = Instance.new("Part")local testDictionary = {partType = "Block",[part] = true}-- Bao gồm dấu ngoặc cho chìa khóa dâyprint(testDictionary["partType"]) -- Khối-- Hoặc sử dụng . để lập chỉ mục các chìa khóa chuỗi không có khoảng trốngprint(testDictionary.partType) -- Khối-- Bỏ dấu ngoặc cho các chìa khóa không phải là chuỗiprint(testDictionary[part]) -- true
Viết vào từ điển
Để xác định hoặc viết lại giá trị của một chìa khóa danh sách mới hoặc hiện có, xác định tên chìa khóa trong dấu ngoặc ( [key] ) hoặc, nếu chìa khóa là một chuỗi, sử dụng ( .key ) theo sau bởi = và giá trị:
local testDictionary = {fruitName = "Lemon",sour = true}-- Thay đổi giá trị của các chìa khóa hiện cótestDictionary["fruitName"] = "Cherry"testDictionary.sour = false-- Chèn cặp chìa khóa-giá trị mớitestDictionary.fruitCount = 10print(testDictionary.fruitName) -- Anh đàoprint(testDictionary.sour) -- giả mạoprint(testDictionary.fruitCount) -- 10
Lặp lại qua các từ điển
Để lặp qua một từ điển, sử dụng một vòng lặp for :
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}for key, value in testDictionary doprint(key, value)end--[[ Kết quả ra:fruitName Lemonsour truefruitColor Yellow]]
Loại bỏ cặp chìa khóa-giá trị
Để xóa hoặc xóa một cặp chìa khóa-giá trị khỏi một từ điển, đặt giá trị của nó cho một chìa khóa thành nil .
local testDictionary = {fruitName = "Lemon",fruitColor = "Yellow",sour = true}testDictionary.sour = nilfor key, value in testDictionary doprint(key, value)end--[[ Kết quả ra:fruitName LemonfruitColor Yellow]]
Bảng làm tham chiếu
Nếu bạn lưu một bảng trong một biến mới, Luau không tạo bản sao của bảng đó.Thay vào đó, biến trở thành một tham chiếu hoặc con trỏ, đến bảng gốc.Bất kỳ tham chiếu đến một bảng phản ánh bất kỳ thay đổi nào đối với bảng gốc:
local originalArray = {10, 20}local arrayReference = originalArrayprint("Original:", originalArray[1], originalArray[2])print("Reference:", arrayReference[1], arrayReference[2])-- Thay đổi giá trị trong mảng ban đầuoriginalArray[1] = 1000originalArray[2] = 2000print("Reference:", arrayReference[1], arrayReference[2])--[[ Kết quả ra:Original: 10 20Reference: 10 20Reference: 1000 2000]]
Bảng sao chép
Nhân bản sâu nông
Để sao chép một bảng mà không có bất kỳ bảng con nào, Luau cung cấp phương pháp table.clone().
local original = {key = "value",engine = "Roblox",playerID = 505306092}local clone = table.clone(original)
Nhân bản sâu
Để sao chép một bảng phức tạp hơn với các bảng lồng bên trong nó, bạn sẽ cần sử dụng chức năng lặp lại tương tự như sau:
-- Chức năng được sử dụng để sao chép sâu một bảng
local function deepClone(original)
-- Xác định bảng mới cho bản sao
local clone = table.clone(original)
-- Vòng lặp qua bảng gốc để kiểm tra các giá trị bảng
-- Nếu một bảng được tìm thấy như một giá trị, hãy sao chép sâu nó vào chìa khóa (索引)
for key, value in original do
if type(value) == "table" then
clone[key] = deepClone(value)
end
end
-- Trả lại bản sao cuối cùng của bảng nhân bản sâu
return clone
end
Với chức năng đã có, bạn có thể tạo bản sao sâu như sau:
local original = {key = "value",playerInfo = {playerID = 505306092,playerName = "PlayerName"},otherInfo = {{{1, 3, 5, 7, 9}}}}local clone = deepClone(original)
Bảng bị đóng băng
Đóng băng một bảng làm cho nó chỉ đọc, có ích cho việc tạo các giá trị cố định mà bạn không muốn thay đổi.Làm lạnh là vĩnh viễn; không có phương pháp "bỏ lạnh" hoặc "nóng" nào.Để kiểm tra xem bảng có bị đóng băng hay không, hãy sử dụng table.isfrozen() .
Đóng băng sâu
Để đóng băng một bảng mà không có bất kỳ bảng con nào, Luau cung cấp phương pháp table.freeze().
local target = {key = "value",engine = "Roblox",playerID = 505306092}table.freeze(target)target.playerID = 1 --> attempt to modify a readonly table
Đóng băng sâu
Để đóng băng một bảng phức tạp hơn với các bảng lồng bên trong nó, sử dụng chức năng lặp lại tương tự như sau:
local function deepFreeze(target)
-- Đóng băng mỏng bảng
table.freeze(target)
-- Kiểm tra mỗi chìa khóa của bảng và đóng băng nó nếu nó là một bảng
for _, value in target do
-- Hãy chắc chắn rằng giá trị không bị đóng băng; nếu nó đã có, một lỗi sẽ xảy ra
if type(value) == "table" and table.isfrozen(value) == false then
deepFreeze(v)
end
end
end
Với chức năng đã có, bạn có thể đóng băng sâu một bảng theo cách sau:
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