SharedTable

Mostrar obsoleto

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Representa una estructura de datos tabular que se puede compartir entre contextos de ejecución.Aunque se puede utilizar para varios tipos de almacenamiento de datos generales, está diseñado especialmente para su uso con Parallel Luau, donde se puede utilizar para compartir el estado entre scripts patrocinados por diferentes Actor.

Hay un par de formas idiomáticas de comunicar tablas compartidas entre scripts.Una forma es almacenar y recuperar objetos SharedTable en el SharedTableRegistry.El registro permite que cualquier script en el mismo modelo de datos obtenga o establezca un SharedTable por nombre.Otro método es usar Actor:SendMessage() para enviar una tabla compartida a otra Actor dentro de un mensaje.

Al igual que una tabla Luau, un objeto SharedTable almacena un conjunto de pares de elementos clave-valor.A diferencia de una tabla Luau, solo se pueden almacenar tipos de objetos seleccionados en una tabla compartida, similar a otras restricciones que encontrará en otra parte del motor Roblox.

Las claves deben ser (1) una cadena o (2) un número entero negativo menor que 2 32 . Otros tipos de claves no son admitidos.

Los valores deben tener uno de los siguientes tipos: Boolean, Number, Vector, String, SharedTable , o un introducirde dato serializable.La capacidad de almacenar un SharedTable como valor en otro SharedTable permite la construcción de estructuras de datos anidadas y recursivas.

SharedTable objetos son distintos y diferentes SharedTable objetos nunca se comparan iguales, incluso si tienen contenido que se compararía igual.

Al igual que una tabla Luau, un objeto SharedTable puede ser congelado, en cuyo caso es de solo lectura.Un intento de modificar un congelado SharedTable elevará un error.Un congelado SharedTable se puede crear primero creando un (no congelado, modificable) SharedTable con el contenido deseado, y luego llamando SharedTable.cloneAndFreeze() para crear un clon congelado de él.

Muestras de código

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

Resumen

Constructores

Funciones

Constructores

new

Devuelve un nuevo, vacío SharedTable .


local st = SharedTable.new()

new

Devuelve un nuevo SharedTable que contiene elementos equivalentes a los de la tabla Luau proporcionada.

Si la tabla Luau proporcionada contiene cualquier clave o valor que no se pueda almacenar en un SharedTable, la construcción del SharedTable falla.Vea el resumen en la parte superior de esta página para una lista de tipos de objetos que se pueden almacenar en un SharedTable .Si la tabla Luau contiene cualquier tabla como valor, esa tabla se convierte en una nueva SharedTable.


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

Tenga en cuenta que en algunos casos puede ser deseable almacenar un SharedTable en el SharedTableRegistry.El método Class.ShareTableRegistry:GetSharedTable() proporciona una manera conveniente de lograr esto.

Parámetros

La tabla Luau cuyos elementos se deben almacenar en la nueva SharedTable.

Funciones

clear

()

Elimina atómicamente todos los elementos de un SharedTable .

Si el SharedTable está congelado, la operación falla y se levantará un error.


local st = SharedTable.new({"a", "b", "c"})
assert(SharedTable.size(st) == 3)
SharedTable.clear(st)
assert(SharedTable.size(st) == 0)

Parámetros

El SharedTable para borrar.

Devuelve

()

Crea un clon de un SharedTable y devuelve el clon.

Si el argumento opcional deep no está presente, o si está presente y su valor es false , se crea un clon superficial.Un clon superficial solo copia el objeto de nivel superior SharedTable.Si algún valor en el propio SharedTable es un SharedTable , entonces tanto el original SharedTable como el clon SharedTable se referirán al mismo SharedTable.

La operación de clon superficial es atómica, por lo que el clon SharedTable contendrá un instantáneo consistente del estado en el original SharedTable, incluso si se está modificando simultáneamente desde otros scripts.

Si el argumento opcional deep opcional está presente y su valor es true , se crea un clon profundo.Un clon profundo copia recursivamente una estructura de SharedTable objetos, de modo que no hay ningún estado compartido entre el original SharedTable y el clon.

El clon de cada SharedTable dentro del gráfico de objetos SharedTable es atómico, pero el clon profundo en su conjunto no es atómico.Por lo tanto, el clon de cada SharedTable dentro del gráfico contendrá un instantáneo consistente del estado del objeto original SharedTable del que se clonó, pero los estados de diferentes objetos SharedTable pueden ser inconsistentes si el gráfico se está modificando simultáneamente desde otros scripts.

Los objetos SharedTable que se están clonando pueden estar congelados (solo de lectura) o no.Independientemente, los clones recién creados no están congelados (y por lo tanto son modificables).Para crear clones congelados, use la función SharedTable.cloneAndFreeze.

Para ilustrar la diferencia entre un clon superficial y un clon profundo, considere los siguientes ejemplos.Esta primera muestra crea un clon superficial y la segunda crea un clon profundo.

Parámetros

El objeto SharedTable para clonar.

deep: boolean

Si crear un clon profundo ( true ) o un clon superficial ( false ).

Valor predeterminado: false

Devuelve

Muestras de código

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

Crea un clon congelado (solo de lectura) de un SharedTable y devuelve el clon.El comportamiento de esta función es el mismo que el comportamiento de clon, excepto que el clon está congelado.

Si se solicita un clon profundo, entonces todos los objetos clonados SharedTable se congelan.

Parámetros

El objeto SharedTable para clonar.

deep: boolean

Si crear un clon profundo ( true ) o un clon superficial ( false ).

Valor predeterminado: false

Devuelve

increment

Incrementa atómicamente el valor de un elemento.Un elemento con la clave especificada debe existir en el SharedTable , y debe ser de tipo number .El especificado delta se agrega al valor y se devuelve el valor original.

La función SharedTable.update también se puede utilizar para este propósito; esta función increment existe por conveniencia y rendimiento (en general, increment es mucho más rápida que update, por lo que debe preferirse donde sea posible).Las siguientes dos llamadas de función tienen el mismo efecto:


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)

Si el SharedTable está congelado, la operación falla y se levantará un error.

Parámetros

El objeto SharedTable que se debe actualizar.

key: string | number

La clave del elemento en el objeto SharedTable que se actualizará.

delta: number

El valor a agregar al elemento en el SharedTable .

Devuelve

El valor original del elemento, antes de que delta se le agregara.

Muestras de código

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

Devuelve true si el SharedTable está congelado (solo de lectura).


local st1 = SharedTable.new({"a", "b", "c"})
assert(not SharedTable.isFrozen(st1))
local st2 = SharedTable.cloneAndFreeze(st1)
assert(SharedTable.isFrozen(st2))

Parámetros

El objeto SharedTable que su estado congelado debe ser consultado.

Devuelve

size

Devuelve el número de elementos almacenados en la tabla compartida.Tenga en cuenta que si otros scripts están modificando simultáneamente la tabla compartida, el tamaño devuelto puede ya no ser correcto después de que se devuelva, ya que otros scripts pueden haber agregado o eliminado elementos de la tabla compartida.


local st = SharedTable.new({"a", "b", "c"})
assert(SharedTable.size(st) == 3)
st[2] = nil
assert(SharedTable.size(st) == 2)

Parámetros

El objeto SharedTable que cuyo tamaño se debe consultar.

Devuelve

update

()

Actualiza atómicamente el valor de un elemento.

Cuando un SharedTable se accede simultáneamente desde scripts que se ejecutan en diferentes contextos de ejecución, es posible que sus accesos se intercambien de forma impredecible.Debido a esto, el código como el siguiente generalmente es incorrecto, porque el valor puede haber cambiado entre la lectura en la primera línea y la actualización en la segunda línea:


local oldValue = st["x"]
st["x"] = oldValue .. ",x"

La función de actualización hace posible realizar una actualización atómica a un elemento.Se toma una función que llamará con el valor actual del elemento.La función puede entonces calcular y devolver el nuevo valor.Tenga en cuenta que la función se puede llamar varias veces si el SharedTable se está modificando simultáneamente desde otros scripts.

Si el SharedTable está congelado, la operación falla y se levantará un error.

Parámetros

El objeto SharedTable que se debe actualizar.

key: string | number

La clave del elemento en el objeto SharedTable que se actualizará.

La función que se llamará para calcular el nuevo valor para el elemento.

Devuelve

()

Muestras de código

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