表示一个类似表的数据结构,可以在执行上下文之间共享。 它可以用于各种类型的一般数据存储,但它特别设计用于使用 Parallel Luau ,在不同 Actor 实例下,可以用于共享状态。
在脚本之间通信共享表时,有几种 idiomatic 方法来通信共享表。一个方法是存储和检索 SharedTable 对象在 SharedTableRegistry 。注册允许任何数据模型中的任何脚本获取或设置一个 Datatype
像 Luau 表一样,一个 SharedTable 对象存储一组键值元素对。与 Luau 表不同,只有选定的对象类型才能存储在共享表中,与您在 Roblox 引擎中找到的其他限制类似。
钥匙必须是 (1) 一个字符串或 (2) 一个不为 2 32 的非负数整数。其他类型的钥匙不是支持的。
值必须有一个以下类型之一:Boolean、Number、Vector、String、SharedTable 或串型数据输入。 允许存储一个 SharedTable 作为值在另一个 SharedTable 中的值。 允许通过将 1> Datatype.SharedTable1> 作为值在另一个 4> Datatype.SharedTable4> 中的值来构建递归递
SharedTable 对象是不同的,不同的 SharedTable 对象永远不会比平等,即使它们有容纳相同的内容。
像 Luau 表一样,一个 SharedTable 对象可能会被冻结,在此情况下它只能读取。尝试修改冰冻的 SharedTable 将会提出错误。冰冻的
代码示例
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))
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
概要
职能
构造工具
new
职能
clone
参数
默认值:false
代码示例
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")
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")
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))
update
void
参数
返回
void
代码示例
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")