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 một cấu trúc dữ liệu trong hành lang thực thi có thể được chia sẻ qua các ngữ cảnh thực thi. Mặc dù nó có thể được sử dụng cho các loại dữ liệu chung như lưu trữ dữ liệu, nhưng nó được thiết kế đặc biệt cho sử dụng với Parallel Luau
Có một vài cách idiomatic để truyền đạt các bảng dữ liệu chia sẻ giữa các script. Một trong những phương pháp là lưu và lấy lại SharedTable
Giống như một cái bàn Luau, một đối tượng SharedTable lưu một bộ dữ liệu bộ đôi giá trị chìa khóa. Giống như một cái bàn Luau, chỉ các loại đối tượng được chọn có thể được lưu trong một bảng Đồng Bộ, tương tự như các hạn chế
Các khóa phải là (1) một chuỗi hoặc (2) một số không được hỗ trợ dưới 2 32 . Các loại khóa khác không được hỗ trợ.
Giá trị phải có một trong những loại sau:Boolean, Số, Vectơ, Chuỗi, SharedTable , hoặc một loại dữ đánh máycó thể serIAL hóa. Khả năng lưu một SharedTable như một giá trị trong một SharedTable khác chế cho ph
SharedTable objects are distinct and different SharedTable objects never compare equal, even if they have content that would compare equal.
Giống như một cái bàn Luau, một SharedTable đối tượng có thể được đóng băng, trong đó nó được đọc chỉ
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ả lại một SharedTable mới, trống.
Trả lại một bảng mới SharedTable chứa các thành phần tương đương với những thành phần trong bảng Luau cung cấp.
Chức Năng
Loại bỏ tất cả các thành phần từ SharedTable .
Tạo và trả lại một bản sao của SharedTable đã cung cấp.
Tạo và trả lại một clon đóng băng (chỉ đọc) của SharedTable đã cung cấp.
Thêm delta vào giá trị với các chìa khóa được cung cấp và trả lại giá trị nguyên bản.
Trả lại true nếu SharedTable đó bị đóng băng (chỉ đọc).
Đếm số lượng các thành phần được lưu trong SharedTable .
Cập nhật giá trị với key cung cấp bằng cách sử dụng chức năng cập nhật được cung cấp.
Người Tạo
new
Trả lại một bảng mới SharedTable chứa các thành phần tương đương với những thành phần trong bảng Luau cung cấp.
Nếu bảng Luau được cung cấp có bất kỳ chìa khóa hoặc giá trị không thể được lưu vào một Datatype.SharedTable , thì việc xây dựng Datatype.SharedTable bị thất bạ
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ể là điều đẹp lòng để lưu một SharedTable trong SharedTableRegistry . Phương thức Class.ShareTableRegistry:GetSharedTable() được cung cấp bởi cách tiện lợi này để thực hiện điều này.
Tham Số
Bảng Luau các thành phần của nó được lưu trong SharedTable mới.
Chức Năng
clear
Atomically loại bỏ tất cả các thành phần từ một SharedTable .
Nếu SharedTable đó bị đóng băng, hoạt động thất bại và một lỗi sẽ được nâng cấp.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)SharedTable.clear(st)assert(SharedTable.size(st) == 0)
Tham Số
The SharedTable to dọn sạch.
Lợi Nhuận
clone
Tạo một bản sao của một SharedTable và trả lại bản sao.
Nếu deep 引数 không có sẵn, hoặc nó đã có và giá trị của nó là
Việc sao chép chéo hướng là nguyên tử, vì vậy sao chép SharedTable sẽ chứa một bức trượt tương tự của trạng thái trong SharedTable gốc, ngay cả khi nó đang được chỉnh sửa hiện tại từ các script khác.
Nếu deep argument option is present and its value is true , thì một deep clone được tạo ra. Một deep clone recursively sao chép một cấu trúc của SharedTable objects, such that there is no state shared between the original 1> Datatype.SharedTable1> và clone.
Các bản sao của mỗi SharedTable trong kết quả của SharedTable đối tượng là nguyên tử, nhưng các bản sa
Các đối tượng SharedTable được sao chép có thể được đóng băng (chỉ đọc) hoặc không. Dù sao thì, các bản sao đã tạo mới không bị đóng băng (và do đó có thể được điều chỉnh). Để tạ
Để minh họa sự khác biệt giữa một chiếc nhân bản sâu và một chiếc nhân bản shallower, xem xét các mẫu sau đây. Mẫu đầu tiên tạo một chiếc nhân bản sâu và mẫu thứ hai tạo một chiếc nhân bản głębok.
Tham Số
Datatype.SharedTable đối tượng để sao chép.
Có nên tạo một bản sao sâu ( true ) hay một bản sao shallower ( 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 đóng băng (chỉ đọc) của một SharedTable và trả lại bản sao. Hành vi của chức năng này giống như hành vi của chức năng sao chép, ngoại trừ việc sao chép đó được đóng băng.
Nếu yêu cầu một phiên bản sâu, tất cả các đối tượng đã được clon SharedTable đều bị đóng băng.
Tham Số
Các thống kê tùy chỉnh của SharedTable để sao chép.
Có nên tạo một bản sao sâu ( true ) hay một bản sao shallower ( false )?
Lợi Nhuận
increment
Tăng giá trị của một yếu tố một cách nguyên tử. Một yếu tố với chìa khóa được xác định phải tồn tại trong SharedTable, và nó phải là kiểu number . Giá trị nguyên tử được thêm vào giá trị, và giá trị gốc được trả lại
Hàm SharedTable.update cũng có thể được sử dụng cho mục đích này; hàm này increment được tạo ra cho tiện lợi và hiệu suất (trong mọi trường phổ quát, increment được nhanh hơn nhiều so với 1> cập nhật1>, vì
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 thất bại và một lỗi sẽ được nâng cấp.
Tham Số
Các đối tượng SharedTable để đượ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ị ban đầu 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ả lại 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ố
Đối tượng SharedTable đóng băng để được truy cập.
Lợi Nhuận
size
Lưu lại số lượng các thành phần được lưu trong SharedTable. Ghi nhớ rằng nếu các script khác đang chỉnh sửa SharedTable cùng một lúc, kích thước đã lưu có thể không còn chính xác sau khi nó được lưu, vì các script khác có thể đã thêm hoặc xóa các thành phần từ SharedTable.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)st[2] = nilassert(SharedTable.size(st) == 2)
Tham Số
Đối tượng SharedTable có kích thước để được yêu cầu.
Lợi Nhuận
update
Cập nhật một cách nhanh chóng giá trị của một thành phần.
Khi một SharedTable được truy cập bằng nhau từ các script đang chạy trong các context chạy khác nhau, có thể có những lỗi trong cách họ truy cập. Vì vậy, mã như sau thường không đúng, bởi vì giá trị có thể thay đổi giữa lần đọc đầu tiên và lần
local oldValue = st["x"]st["x"] = oldValue .. ",x"
Chức năng cập nhật cho phép thực hiện một cập nhật nguyên tử cho một thành phần. Nó yêu cầu một hàm mà nó sẽ gọi với giá trị hiện tại của thành phần. Hàm này sau đó có thể tính toán và trả lại giá trị mới. Lưu ý rằng hàm này có thể được g
Nếu SharedTable đó bị đóng băng, hoạt động thất bại và một lỗi sẽ được nâng cấp.
Tham Số
Các đối tượng SharedTable để đượ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.
Hàm 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")