SharedTable
*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.
Representa uma estrutura de dados semelhante a uma mesa que pode ser compartilhada entre contextos de execução.Embora possa ser usado para vários tipos de armazenamento geral de dados, foi projetado especialmente para uso com Parallel Luau, onde pode ser usado para compartilhar estado entre scripts parentados sob diferentes Actor.
Existem algumas maneiras idiomáticas de comunicar tabelas compartilhadas entre scripts.Um método é armazenar e recuperar SharedTable objetos no SharedTableRegistry.O registro permite que qualquer script no mesmo modelo de dados obtenha ou defina um SharedTable por nome.Outro método é usar Actor:SendMessage() para enviar uma tabela compartilhada para outra Actor dentro de uma mensagem.
Como uma tabela Luau, um objeto SharedTable armazena um conjunto de pares de elementos chave-valor.Ao contrário de uma tabela Luau, apenas tipos selecionados de objetos podem ser armazenados em uma Tabela Compartilhada, semelhante a outras restrições que você encontrará em outros lugares do Roblox Engine.
Chaves devem ser (1) uma string ou (2) um número inteiro negativo menor que 2 32. Outros tipos de chaves não são suportados.
Os valores devem ter um dos seguintes tipos: Boolean, Número, Vetor, String, SharedTable ou um digitarde dado serializável.A capacidade de armazenar um SharedTable como um valor em outro SharedTable permite a construção de estruturas de dados aninhadas e recursivas.
SharedTable objetos são distintos e diferentes SharedTable objetos nunca se compararão iguais, mesmo que tenham conteúdo que se comparará igual.
Como uma tabela Luau, um objeto SharedTable pode ser congelado, no qual caso ele é leitura-somente.Uma tentativa de modificar um congelado SharedTable vai levantar um erro.Um congelado SharedTable pode ser criado primeiro criando um (não congelado, modificável) SharedTable com o conteúdo desejado, e então chamando SharedTable.cloneAndFreeze() para criar um clone congelado dele.
Amostras de código
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))
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
Resumo
Funções
Construtores
new
Funções
clone
Parâmetros
Devolução
Amostras de código
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")
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
Parâmetros
Devolução
increment
Parâmetros
Devolução
Amostras de código
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
Parâmetros
Devolução
Amostras de código
local st = SharedTable.new()
st["x"] = "abcd"
SharedTable.update(st, "x", function(v)
assert(v == "abcd")
return v .. "e"
end)
assert(st["x"] == "abcde")