SharedTable
*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.
Đại diện cho một cấu trúc dữ liệu giống như bảng có thể được chia sẻ giữa các bối cảnh thực thi.Mặc dù nó có thể được sử dụng cho các loại dữ liệu chung khác nhau, nó được thiết kế đặc biệt để sử dụng với Parallel Luau , nơi nó có thể được sử dụng để chia sẻ trạng thái giữa các tập lệnh cha thuộc các định dạng khác nhau.
Có một vài cách idiomatic để giao tiếp các bảng chia sẻ giữa các kịch bản.Một phương pháp là lưu và lấy lại SharedTable đối tượng trong SharedTableRegistry .Nhà đăng ký cho phép bất kỳ kịch bản nào trong cùng một mô hình dữ liệu nhận hoặc thiết lập một SharedTable bằng tên.Phương pháp khác là sử dụng Actor:SendMessage() để gửi một bảng chia sẻ sang một Actor khác bên trong tin nhắn.
Giống như một bảng Luau, một đối tượng SharedTable lưu một bộ các cặp chìa khóa-giá trị.Không giống như một bảng Luau, chỉ các loại đối tượng được chọn có thể được lưu trong SharedTable, tương tự như các hạn chế khác bạn sẽ tìm thấy ở nơi khác trong Roblox Engine.
Chìa khóa phải là (1) một chuỗi hoặc (2) một số nguyên tố âm nhỏ hơn 2 32 . Các loại chìa khóa khác không được hỗ trợ.
Giá trị phải có một trong các loại sau: Boolean, Number, Vector, String, SharedTable , hoặc một đánh máydữ liệu có thể serialize.Khả năng lưu trữ một SharedTable như một giá trị trong một SharedTable khác cho phép xây dựng cấu trúc dữ liệu lồng nhau và lặp lại.
SharedTable các đối tượng khác nhau và khác nhau SharedTable các đối tượng không bao giờ so sánh bằng nhau, ngay cả khi chúng có nội dung tương tự.
Giống như một bảng Luau, một đối tượng SharedTable có thể bị đóng băng, trong trường hợp đó nó là đọc chỉ.Một lần thử để sửa đổi một cái băng SharedTable sẽ gây ra một lỗi.Một frozen SharedTable có thể được tạo bằng cách đầu tiên tạo một (không đóng băng, có thể sửa đổi) SharedTable với nội dung mong muốn, sau đó gọi SharedTable.cloneAndFreeze() để tạo một bản sao đóng băng của nó.
Mẫu mã
Elements in a SharedTable are accessed in the same way as elements of Luau tables, using the st[k] syntax or, for string keys, st.k.
local st = SharedTable.new()
st[1] = "a"
st["x"] = true
st.y = 5
assert(st[1] == "a")
assert(st["x"] == true)
assert(st.x == true)
assert(st["y"] == 5)
assert(st.y == 5)
-- true is not a valid SharedTable key, so attempting to set that key
-- fails:
assert(not pcall(function() st[true] = 100 end))
-- A function is not a valid SharedTable value, so attempting to set a
-- value to a function fails:
assert(not pcall(function() st["f"] = function() end end))
The for loop can be used to iterate over the elements of a SharedTable. The elements of the SharedTable are not iterated directly. Instead, a shallow clone is made of the SharedTable, and its elements are iterated. This is done to ensure that a consistent view of the SharedTable is maintained throughout the iteration. Thus, both of the following for loops have the same behavior.
Note that this means that if the SharedTable is accessed directly from within the body of the iteration loop, its state may not be consistent with the state observed through the iteration.
The iteration order is partially specified. Elements with numeric keys are iterated before elements with string keys. Elements with numeric keys are iterated in ascending numeric order. Elements with string keys are iterated in an unspecified order.
local st = SharedTable.new({"a", "b", "c"})
for k, v in SharedTable.clone(st, false) do
print(k, ": ", v)
end
for k, v in st do
print(k, ": ", v)
end
Tóm Tắt
Người Tạo
- new()
Trả về một mới, trống SharedTable .
Trả về một new SharedTable chứa các thành phần tương đương với những thành phần trong bảng Luau được cung cấp.
Chức Năng
Loại bỏ tất cả các yếu tố từ SharedTable .
Tạo và trả về một bản sao của SharedTable được cung cấp.
Tạo và trả về một bản sao lưu bị đóng băng (chỉ đọc) của SharedTable được cung cấp.
Thêm delta vào giá trị với chìa khóa được cung cấp và trả lại giá trị ban đầu.
Trả về true nếu SharedTable bị đóng băng (chỉ đọc).
Trả về số lượng các thành phần được lưu trong SharedTable .
Cập nhật giá trị với chìa khóa được cung cấp thông qua chức năng cập nhật cung cấp.
Người Tạo
new
Trả về một new SharedTable chứa các thành phần tương đương với những thành phần trong bảng Luau được cung cấp.
Nếu bảng Luau được cung cấp có bất kỳ chìa khóa hoặc giá trị nào không thể lưu trong một SharedTable, quá trình xây dựng của SharedTable thất bại.Xem tổng quát ở đầu trang này cho một danh sách các loại đối tượng có thể được lưu trữ trong một SharedTable .Nếu bảng Luau có bất kỳ bảng nào như giá trị, bảng đó được chuyển thành một bảng mới SharedTable.
local t = {}t.x = 1t.y = 2t.z = {"a", "b", "c"}local st = SharedTable.new(t)assert(st.x == 1)assert(st.y == 2)assert(st.z[1] == "a")assert(st.z[2] == "b")assert(st.z[3] == "c")
Lưu ý rằng trong một số trường hợp có thể mong muốn lưu trữ một SharedTable trong SharedTableRegistry.Phương pháp Class.ShareTableRegistry:GetSharedTable() cung cấp một cách thuận tiện để hoàn thành việc này.
Tham Số
Bảng Luau mà các thành phần của nó sẽ được lưu trong new SharedTable .
Chức Năng
clear
Loại bỏ hoàn toàn tất cả các yếu tố từ một SharedTable .
Nếu SharedTable bị đóng băng, hoạt động sẽ thất bại và một lỗi sẽ được nâng lên.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)SharedTable.clear(st)assert(SharedTable.size(st) == 0)
Tham Số
The SharedTable để dọn sạch.
Lợi Nhuận
clone
Tạo một bản sao của một SharedTable và trả về bản sao.
Nếu tham số tùy chọn deep không có mặt hoặc nếu nó có mặt và giá trị của nó là false thì một bản sao sâu được tạo ra.Một bản sao nhân sâu chỉ sao chép đối tượng cấp cao nhất SharedTable.Nếu bất kỳ giá trị nào trong SharedTable bản thân là SharedTable , thì cả bản gốc SharedTable và bản sao SharedTable sẽ đề cập đến cùng một SharedTable .
Hoạt động nhân bản sâu nông là nguyên tử, vì vậy nhân bản SharedTable sẽ chứa một bức xúc nhất quán của trạng thái trong bản gốc SharedTable, ngay cả khi nó được sửa đổi song song từ các tập lệnh khác.
Nếu tham số tùy chọn deep không có và giá trị của nó là true, thì một bản sao sâu được tạo ra.Một bản sao sâu nhân bản lặp lại một cấu trúc của SharedTable đối tượng, như vậy không có trạng thái được chia sẻ giữa bản gốc SharedTable và bản sao.
Bản sao của mỗi SharedTable trong đồ thị của SharedTable đối tượng là nguyên tử, nhưng bản sao sâu như một tổng thể không phải là nguyên tử.Do đó, bản sao của mỗi trong biểu đồ sẽ chứa một bức xúc nhất quán của trạng thái của đối tượng gốc đã được sao chép, nhưng các trạng thái của các đối tượng khác nhau có thể không đồng nhất nếu biểu đồ đang được sửa đổi cùng lúc từ các tập lệnh khác.
Các đối tượng SharedTable được sao chép có thể bị đóng băng (chỉ đọc) hoặc không.Bất kể, những bản sao được tạo mới là không bị đóng băng (và do đó có thể thay đổi).Để tạo bản sao lạnh, hãy sử dụng chức năng SharedTable.cloneAndFreeze.
Để minh họa sự khác biệt giữa một bản sao sâu và một bản sao sâu, hãy xem xét các mẫu sau.Ví dụ đầu tiên này tạo một bản sao sâu và ví dụ thứ hai tạo một bản sao sâu.
Tham Số
Vật thể SharedTable để sao chép.
Có nên tạo một bản sao sâu ( true ) hoặc một bản sao nông ( false ).
Lợi Nhuận
Mẫu mã
This code sample creates a shallow clone of a SharedTable.
local original = SharedTable.new()
original["a"] = "original a"
original["b"] = "original b"
original["c"] = SharedTable.new()
original["c"]["d"] = "original d"
local clone = SharedTable.clone(original, false)
clone["a"] = "new a"
clone["b"] = "new b"
clone["c"]["d"] = "new d"
assert(original["a"] == "original a")
assert(original["b"] == "original b")
-- Because this was a shallow clone, original["c"] and clone["c"] are
-- the same SharedTable object.
assert(original["c"] == clone["c"])
assert(original["c"]["d"] == "new d")
This code sample creates a deep clone of a SharedTable.
local original = SharedTable.new()
original["a"] = "original a"
original["b"] = "original b"
original["c"] = SharedTable.new()
original["c"]["d"] = "original d"
local clone = SharedTable.clone(original, true)
clone["a"] = "new a"
clone["b"] = "new b"
clone["c"]["d"] = "new d"
assert(original["a"] == "original a")
assert(original["b"] == "original b")
-- Because this was a deep clone, clone["c"] is a clone of original["c"];
-- they are distinct SharedTable objects.
assert(original["c"] ~= clone["c"])
assert(original["c"]["d"] == "original d")
cloneAndFreeze
Tạo một bản sao lưu (chỉ đọc) bị đóng băng của một SharedTable và trả lại bản sao lưu.Hành vi của chức năng này giống như hành vi của bản sao, ngoại trừ việc bản sao bị đóng băng.
Nếu yêu cầu một bản sao sâu, thì tất cả các đối tượng được sao chép SharedTable đều bị đóng băng.
Tham Số
Vật thể SharedTable để sao chép.
Có nên tạo một bản sao sâu ( true ) hoặc một bản sao nông ( false ).
Lợi Nhuận
increment
Tăng giá trị của một thành phần theo nguyên tử.Một thành phần với chìa khóa được chỉ định phải tồn tại trong SharedTable , và nó phải là kiểu number .Giá trị được chỉ định delta được thêm vào giá trị và giá trị gốc được trả lại.
Chức năng SharedTable.update cũng có thể được sử dụng cho mục đích này; chức năng increment này tồn tại vì tiện ích và hiệu suất (nói phổ quát, increment nhanh hơn nhiều so với update, vì vậy nó nên được ưu tiên nếu có thể).Hai cuộc gọi chức năng sau đây có cùng hiệu ứng:
local st = SharedTable.new()
st["x"] = 1
local oldValue = SharedTable.increment(st, "x", 1)
SharedTable.update(st, "x", function(v)
oldValue = v
return v + 1
end)
Nếu SharedTable bị đóng băng, hoạt động sẽ thất bại và một lỗi sẽ được nâng lên.
Tham Số
Vật thể SharedTable sẽ được cập nhật.
Chìa khóa của thành phần trong đối tượng SharedTable được cập nhật.
Giá trị được thêm vào thành phần trong SharedTable .
Lợi Nhuận
Giá trị gốc của thành phần, trước khi delta được thêm vào nó.
Mẫu mã
This code sample demonstrates usage of SharedTable.increment().
local st = SharedTable.new()
st["x"] = 1
local oldValue = SharedTable.increment(st, "x", 1)
assert(oldValue == 1)
assert(st["x"] == 2)
-- The value of the specified key must be a number. If it is not a
-- number, the call will fail:
st["y"] = "test"
assert(not pcall(function() SharedTable.increment(st, "y", 1) end))
isFrozen
Trả về true nếu SharedTable bị đóng băng (chỉ đọc).
local st1 = SharedTable.new({"a", "b", "c"})assert(not SharedTable.isFrozen(st1))local st2 = SharedTable.cloneAndFreeze(st1)assert(SharedTable.isFrozen(st2))
Tham Số
Vật thể SharedTable có trạng thái bị đóng băng mà sẽ được truy vấn.
Lợi Nhuận
size
Trả về số lượng các yếu tố được lưu trong Cơ sở dữ liệu Chia sẻ.Lưu ý rằng nếu các kịch bản khác đang cùng thời gian sửa đổi Bảng Chia sẻ, kích thước trả về có thể không còn chính xác sau khi nó được trả về, vì các kịch bản khác có thể đã thêm hoặc xóa các yếu tố từ Bảng Chia sẻ.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)st[2] = nilassert(SharedTable.size(st) == 2)
Tham Số
Vật thể SharedTable có kích thước sẽ được truy vấn.
Lợi Nhuận
update
Cập nhật giá trị của một thành phần một cách nguyên tử.
Khi một SharedTable được truy cập cùng lúc từ các kịch bản chạy trong các bối cảnh thực thi khác nhau, có thể cho phép truy cập của chúng lẫn nhau không thể đoán trước.Vì lý do này, mã như sau thường không chính xác, vì giá trị có thể đã thay đổi giữa đọc trên dòng đầu tiên và cập nhật trên dòng thứ hai:
local oldValue = st["x"]st["x"] = oldValue .. ",x"
Chức năng cập nhật làm cho việc thực hiện một cập nhật nguyên tử cho một thành phần trở nên khả thi.Nó sử dụng một chức năng mà nó sẽ gọi với giá trị hiện tại của thành phần.Chức năng có thể sau đó tính toán và trả lại giá trị mới.Lưu ý rằng chức năng có thể được gọi nhiều lần nếu SharedTable đang được sửa đổi song song từ các kịch bản khác.
Nếu SharedTable bị đóng băng, hoạt động sẽ thất bại và một lỗi sẽ được nâng lên.
Tham Số
Vật thể SharedTable sẽ được cập nhật.
Chìa khóa của thành phần trong đối tượng SharedTable được cập nhật.
Chức năng sẽ được gọi để tính toán giá trị mới cho thành phần.
Lợi Nhuận
Mẫu mã
This code sample demonstrates usage of SharedTable.update().
local st = SharedTable.new()
st["x"] = "abcd"
SharedTable.update(st, "x", function(v)
assert(v == "abcd")
return v .. "e"
end)
assert(st["x"] == "abcde")