SharedTable

Hiển Thị Bản Đã Lỗi Thời

*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.

Element Access

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.

Element Iteration

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.

  • new(t : table)

    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

Người Tạo

new

Trả lại một SharedTable mới, trống.


local st = SharedTable.new()

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 = 1
t.y = 2
t.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

()

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.

deep: boolean

Có nên tạo một bản sao sâu ( true ) hay một bản sao shallower ( false )?

Giá Trị Mặc Định: false

Lợi Nhuận

Mẫu mã

This code sample creates a shallow clone of a SharedTable.

Shallow Clone

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.

Deep Clone

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.

deep: boolean

Có nên tạo một bản sao sâu ( true ) hay một bản sao shallower ( false )?

Giá Trị Mặc Định: 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.

key: string | number

Chìa khóa của thành phần trong đối tượng SharedTable để được cập nhật.

delta: number

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().

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] = nil
assert(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.

key: string | number

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().

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")