Bảng

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

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ục
local 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ục
local testArray = {"A string", 3.14159, true}
print(testArray[1]) -- Một chuỗi
print(testArray[2]) -- 3.14159
print(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] = 12345
testArray[4] = "New string"
print(testArray[2]) --12345
print(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 chung
for index, value in testArray do
print(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 do
print(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ới
print(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ên
print(testArray[2]) -- Vật phẩm mới #2
print(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ên
print(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 =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ây
print(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ống
print(testDictionary.partType) -- Khối
-- Bỏ dấu ngoặc cho các chìa khóa không phải là chuỗi
print(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ới
testDictionary.fruitCount = 10
print(testDictionary.fruitName) -- Anh đào
print(testDictionary.sour) -- giả mạo
print(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 do
print(key, value)
end
--[[ Kết quả ra:
fruitName Lemon
sour true
fruitColor 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 = nil
for key, value in testDictionary do
print(key, value)
end
--[[ Kết quả ra:
fruitName Lemon
fruitColor 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 = originalArray
print("Original:", originalArray[1], originalArray[2])
print("Reference:", arrayReference[1], arrayReference[2])
-- Thay đổi giá trị trong mảng ban đầu
originalArray[1] = 1000
originalArray[2] = 2000
print("Reference:", arrayReference[1], arrayReference[2])
--[[ Kết quả ra:
Original: 10 20
Reference: 10 20
Reference: 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