Kiểu dữ liệu bảng có thể lưu trữ nhiều giá trị của bất kỳ kiểu nào không phải là nil, bao gồm các giá trị boolean, các số, các chuỗi, các hàm, và các bảng khác. Xây dựng bảng với dấu ngoặc nhọn ({}):
-- Tạo một bảng rỗng gán cho biến "t"local t = {}print(t) -- {}
Bạn có thể sử dụng một bảng như một mảng hoặc từ điển. Mảng sử dụng danh sách số có thứ tự làm chỉ số, nhưng từ điển có thể có số, chuỗi và đối tượng làm chỉ số.
Để biết thêm thông tin về các hàm tích hợp sẵn để làm việc với bảng, hãy xem thư viện table.
Mảng
Một mảng là một danh sách có thứ tự các giá trị. Mảng rất hữu ích để lưu trữ tập hợp dữ liệu, chẳng hạn như một nhóm người chơi có quyền hạn đặc biệt.
Tạo mảng
Để tạo một mảng bằng cách sử dụng bảng Luau, hãy khai báo các giá trị theo trình tự, cách nhau bằng dấu phẩy.
-- Tạo một mảng với ba mụclocal testArray = {"Một chuỗi", 3.14159, true}print(testArray)
Đọc từ mảng
Để đọc một mảng, thêm một cặp dấu ngoặc vuông sau tham chiếu của nó và chỉ định số chỉ mục của phần tử bên trong ([pos]):
-- Tạo một mảng với ba mụclocal testArray = {"Một chuỗi", 3.14159, true}print(testArray[1]) -- Một chuỗiprint(testArray[2]) -- 3.14159print(testArray[3]) -- true
Ghi vào mảng
Để định nghĩa hoặc ghi lại giá trị của một mảng tại một chỉ số, hãy khai báo số chỉ số trong dấu ngoặc vuông ([index]) theo sau là = và giá trị:
local testArray = {"Một chuỗi", 3.14159, true}testArray[2] = 12345testArray[4] = "Chuỗi mới"print(testArray[2]) -- 12345print(testArray[4]) -- Chuỗi mới
Lặp qua mảng
Để lặp qua một mảng, bạn có thể sử dụng vòng lặp for. Bởi vì các mảng có chỉ số số, bạn cũng có thể sử dụng vòng lặp for số từ 1 đến độ dài của mảng (#array).
local testArray = {"Một chuỗi", 3.14159, true, "Chuỗi mới"}-- Vòng lặp sử dụng lặp chungfor index, value in testArray doprint(index, value)end-- Lặp qua sử dụng toán tử độ dài mảng (#)for index = 1, #testArray doprint(index, testArray[index])end
Chèn mục
Có hai cách tích hợp sẵn để chèn một mục vào cuối của một mảng:
- Truyền tham chiếu đến mảng và giá trị mục vào hàm table.insert() của Luau.
- Thêm mục mới vào mảng bằng cú pháp array[#array+1].
local testArray = {"Một chuỗi", 3.14159}table.insert(testArray, "Chuỗi mới")testArray[#testArray+1] = "Một chuỗi mới khác"print(testArray[3]) -- Chuỗi mớiprint(testArray[4]) -- Một chuỗi mới khác
Để chèn một mục giữa đầu và cuối của một mảng, hãy bao gồm một giá trị vị trí làm đối số thứ hai của table.insert(). Điều này sẽ chèn mục mới và đẩy các mục theo sau lên một vị trí chỉ số.
local testArray = {"Mục đầu tiên", "Mục tiếp theo"}table.insert(testArray, 2, "MỤC MỚI #2")print(testArray[1]) -- Mục đầu tiênprint(testArray[2]) -- MỤC MỚI #2print(testArray[3]) -- Mục tiếp theo
Xóa mục
Để xóa một mục khỏi mảng, sử dụng table.remove(). Điều này sẽ xóa mục ở vị trí chỉ định và di chuyển bất kỳ mục nào theo sau lùi lại một vị trí chỉ số.
local testArray = {"Mục đầu tiên", "Mục tiếp theo", "Mục cuối cùng"}table.remove(testArray, 2)print(testArray[1]) -- Mục đầu tiênprint(testArray[2]) -- Mục cuối cùng
Từ điển
Từ điển là một mở rộng của mảng. Từ điển lưu trữ một tập hợp các cặp khóa-giá trị, trong đó các khóa có thể là bất kỳ số nào, chuỗi nào hoặc đối tượng nào.
Tạo từ điển
Để tạo một bảng từ điển, định nghĩa mỗi khóa theo sau là = và giá trị. Tách mỗi cặp khóa-giá trị bằng dấu phẩy:
local testDictionary = {fruitName = "Chanh",fruitColor = "Vàng",sour = true}
Các khóa cho từ điển có thể là số, chuỗi và đối tượng. Ví dụ, một khóa cũng có thể là một Instance. Để sử dụng đối tượng làm khóa, hãy khai báo khóa trong dấu ngoặc vuông ([key]):
local part = Instance.new("Part")local testDictionary = {partType = "Khối",[part] = true}
Đọc từ từ điển
Để đọc từ một từ điển, thêm một cặp dấu ngoặc sau tham chiếu của nó và chỉ định tên khóa. Tham chiếu trực tiếp một khóa chuỗi 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 = "Khối",[part] = true}-- Bao gồm dấu ngoặc cho các khóa chuỗiprint(testDictionary["partType"]) -- Khối-- Hoặc sử dụng . để chỉ mục các khóa chuỗi không có dấu cáchprint(testDictionary.partType) -- Khối-- Bỏ dấu ngoặc cho các khóa không phải chuỗiprint(testDictionary[part]) -- true
Ghi vào từ điển
Để định nghĩa hoặc ghi lại giá trị của một khóa từ điển mới hoặc đã tồn tại, hãy khai báo tên khóa trong dấu ngoặc ([key]) hoặc, nếu khóa là một chuỗi, sử dụng (.key) theo sau là = và giá trị:
local testDictionary = {fruitName = "Chanh",sour = true}-- Thay đổi giá trị của các khóa đã tồn tạitestDictionary["fruitName"] = "Anh đào"testDictionary.sour = false-- Chèn cặp khóa-giá trị mớitestDictionary.fruitCount = 10print(testDictionary.fruitName) -- Anh đàoprint(testDictionary.sour) -- falseprint(testDictionary.fruitCount) -- 10
Lặp qua từ điển
Để lặp qua một từ điển, sử dụng một vòng lặp for:
local testDictionary = {fruitName = "Chanh",fruitColor = "Vàng",sour = true}for key, value in testDictionary doprint(key, value)end--[[ Kết quả xuất ra:fruitName Chanhsour truefruitColor Vàng]]
Xóa cặp khóa-giá trị
Để xóa hoặc xóa một cặp khóa-giá trị khỏi một từ điển, hãy đặt giá trị của khóa thành nil.
local testDictionary = {fruitName = "Chanh",fruitColor = "Vàng",sour = true}testDictionary.sour = nilfor key, value in testDictionary doprint(key, value)end--[[ Kết quả xuất ra:fruitName ChanhfruitColor Vàng]]
Bảng như là tham chiếu
Nếu bạn lưu trữ một bảng trong một biến mới, Luau sẽ không tạo một 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ào đến một bảng đều phản ánh bất kỳ thay đổi nào đối với bảng gốc:
local originalArray = {10, 20}local arrayReference = originalArrayprint("Bản gốc:", originalArray[1], originalArray[2])print("Tham chiếu:", arrayReference[1], arrayReference[2])-- Thay đổi giá trị trong mảng gốcoriginalArray[1] = 1000originalArray[2] = 2000print("Tham chiếu:", arrayReference[1], arrayReference[2])--[[ Kết quả xuất ra:Bản gốc: 10 20Tham chiếu: 10 20Tham chiếu: 1000 2000]]
Sao chép bảng
Sao chép nông
Để sao chép một bảng mà không có bất kỳ bảng lồng trong đó, Luau cung cấp phương thức table.clone().
local original = {key = "value",engine = "Roblox",playerID = 505306092}local clone = table.clone(original)
Sao chép 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, bạn sẽ cần sử dụng một hàm đệ quy tương tự như sau:
-- Hàm được sử dụng để sao chép sâu một bảng
local function deepClone(original)
-- Định nghĩa bảng mới cho bản sao
local clone = table.clone(original)
-- 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 dưới dạng giá trị, sao chép sâu nó vào khóa (chỉ số)
for key, value in original do
if type(value) == "table" then
clone[key] = deepClone(value)
end
end
-- Trả về bản sao không thay đổi của bảng sao chép sâu
return clone
end
Với hàm đã được thiết lập, bạn có thể thực hiện sao chép sâu như sau:
local original = {key = "value",playerInfo = {playerID = 505306092,playerName = "Tên Người Chơi"},otherInfo = {{{1, 3, 5, 7, 9}}}}local clone = deepClone(original)
Đóng băng bảng
Đóng băng một bảng làm cho nó chỉ đọc, điều này hữu ích để tạo ra các giá trị hằng mà bạn không muốn thay đổi. Việc đóng băng là vĩnh viễn; không có phương thức "mở khóa" hay "giải phóng". Để kiểm tra xem một bảng có bị đóng băng hay không, hãy sử dụng table.isfrozen().
Đóng băng nông
Để đóng băng một bảng mà không có bất kỳ bảng lồng nào, Luau cung cấp phương thức table.freeze().
local target = {key = "value",engine = "Roblox",playerID = 505306092}table.freeze(target)target.playerID = 1 --> cố gắng sửa đổi một bảng chỉ đọc
Đó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, sử dụng một hàm đệ quy tương tự như sau:
local function deepFreeze(target)
-- Đóng băng nông bảng
table.freeze(target)
-- Kiểm tra từng khóa của bảng và đóng băng nó nếu đó là một bảng
for _, value in target do
-- Đảm bảo giá trị không bị đóng băng; nếu nó đã bị, sẽ xảy ra lỗi
if type(value) == "table" and table.isfrozen(value) == false then
deepFreeze(value)
end
end
end
Với hàm đã được thiết lập, bạn có thể đóng băng sâu một bảng như sau:
local target = {key = "value",playerInfo = {playerID = 505306092,playerName = "Tên Người Chơi"},otherInfo = {{{1, 3, 5, 7, 9}}}}deepFreeze(target)target.playerInfo.playerID = 1 --> cố gắng sửa đổi một bảng chỉ đọc