SharedTable

Visualizza obsoleti

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Rappresenta una struttura dati tabellare che può essere condivisa tra contesti di esecuzione.Mentre può essere utilizzato per varie tipologie di archiviazione dati generali, è progettato specialmente per l'uso con Parallel Luau, dove può essere utilizzato per condividere lo stato tra gli script parentizzati sotto diverse Actor.

Ci sono un paio di modi idiomatici per comunicare tabelle condivise tra gli script.Un metodo è quello di archiviare e recuperare SharedTable oggetti nel SharedTableRegistry .Il registro consente a qualsiasi script nello stesso modello di dati di ottenere o impostare un SharedTable per nome.Un altro metodo è quello di utilizzare Actor:SendMessage() per inviare una tabella condivisa a un altro Actor all'interno di un Messaggio.

Come un tavolo Luau, un oggetto SharedTable memorizza un set di coppie di elementi chiave-valore.A differenza di una tabella Luau, solo i tipi di oggetti selezionati possono essere memorizzati in una tabella condivisa, simile ad altre restrizioni che troverai altrove nel motore Roblox.

Le chiavi devono essere (1) una stringa o (2) un numero intero non negativo inferiore a 2 32 . Altri tipi di chiavi non sono supportati.

I valori devono avere uno dei seguenti tipi: Boolean, Number, Vector, String, SharedTable , o un inserisci / scrividi dati serializzabile.La capacità di memorizzare un SharedTable come valore in un altro SharedTable consente la costruzione di strutture dati nidate e ricorsive.

SharedTable gli oggetti sono distinti e diversi SharedTable gli oggetti non si confrontano mai uguali, anche se hanno contenuti che potrebbero essere uguali.

Come un tavolo Luau, un oggetto SharedTable può essere congelato, in cui caso è in lettura solo.Un tentativo di modificare un congelato SharedTable porterà un errore.Un congelato SharedTable può essere creato prima creando un (non congelato, modificabile) SharedTable con i contenuti desiderati, e poi chiamando SharedTable.cloneAndFreeze() per creare un clone congelato di esso.

Campioni di codice

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

Il ciclo for può essere utilizzato per itterare sugli elementi di un SharedTable .Gli elementi del SharedTable non vengono iterati direttamente.Invece, un clone superficiale è fatto di SharedTable , e i suoi elementi vengono iterati.Questo viene fatto per garantire che venga mantenuta una vista coerente del SharedTable durante l'iterazione.Pertanto, entrambi i seguenti per i cicli hanno lo stesso comportamento.

Nota che questo significa che se l'SharedTable è accessibile direttamente dal corpo del ciclo di iterazione, il suo stato potrebbe non essere coerente con lo stato osservato attraverso l'iterazione.

L'ordine di iterazione è parzialmente specificato.Gli elementi con chiavi numeriche vengono iterati prima degli elementi con chiavi di stringa.Gli elementi con chiavi numeriche vengono iterati in ordine crescente numerico.Gli elementi con chiavi di stringa vengono iterati in un ordine non specificato.

Iterazione degli elementi

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

Sommario

Costruttori

Funzioni

Costruttori

new

Restituisce un nuovo, vuoto SharedTable .


local st = SharedTable.new()

new

Restituisce un nuovo SharedTable contenente elementi equivalenti a quelli nella tabella Luau fornita.

Se la tabella Luau fornita contiene qualsiasi chiave o valore che non può essere memorizzato in un SharedTable, la costruzione del SharedTable fallisce.Vedi la sintesi nella parte superiore di questa pagina per un elenco di tipi di oggetti che possono essere memorizzati in un SharedTable .Se la tabella Luau contiene qualsiasi tabella come valore, quella tabella viene convertita in una nuova 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")

Si noti che in alcuni casi potrebbe essere desiderabile archiviare un SharedTable in SharedTableRegistry.Il metodo Class.ShareTableRegistry:GetSharedTable() fornisce un modo conveniente per realizzarlo.

Parametri

La tabella Luau i cui elementi devono essere memorizzati nel nuovo SharedTable .

Funzioni

clear

()

Rimuove atomicamente tutti gli elementi da un SharedTable .

Se il SharedTable è congelato, l'operazione fallisce e verrà sollevata un'errore.


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

Parametri

Il SharedTable per Eliminare/Pulire.

Restituzioni

()

Crea un clone di un SharedTable e restituisce il clone.

Se l'argomento opzionale deep non è presente, o se è presente e il suo valore è false , viene creato un clonaggio superficiale.Un clone superficiale copia solo l'oggetto di alto livello SharedTable .Se qualsiasi valore nell'SharedTable stesso è un SharedTable , allora sia l'originale SharedTable che il clone SharedTable si riferiranno allo stesso SharedTable .

L'operazione di clonazione superficiale è atomica, quindi il clone SharedTable conterrà uno snapshot coerente dello stato nell'originale SharedTable, anche se viene modificato contemporaneamente da altri script.

Se l'argomento opzionale deep è presente e il suo valore è true, viene creato un clone profondo.Un clone profondo copia ricorsivamente una struttura di SharedTable oggetti, in modo che non ci sia uno stato condiviso tra l'originale SharedTable e il clone.

Il clone di ciascun SharedTable all'interno del grafico di oggetti SharedTable è atomico, ma il deep clone nel suo complesso non è atomico.Pertanto, il clone di ogni SharedTable all'interno del grafico conterrà uno snapshot coerente dello stato dell'oggetto originale SharedTable da cui è stato clonato, ma gli stati di diversi oggetti SharedTable possono essere incoerenti se il grafico viene modificato contemporaneamente da altri script.

Gli oggettoSharedTable in clonamento possono essere congelati (lettura solo) o no.Indipendentemente da ciò, le nuove cloni create sono non congelate (e sono quindi modificabili).Per creare cloni congelati, usa la funzione SharedTable.cloneAndFreeze.

Per illustrare la differenza tra un clone superficiale e un clone profondo, considera i seguenti esempi.Questo primo campione crea un clone superficiale e il secondo crea un clone profondo.

Parametri

L'oggetto SharedTable da clonare.

deep: boolean

Se creare un clone profondo ( true ) o un clone superficiale ( false ).

Valore predefinito: false

Restituzioni

Campioni di codice

Questo esempio di codice crea un clone superficiale di un SharedTable .

Clone Superficiale

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")
-- Poiché questo era un clone superficiale, original ["c"] e clone ["c"] sono
-- lo stesso oggetto SharedTable condiviso.
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 clone congelato (read-only) di un SharedTable e restituisce il clone.Il comportamento di questa funzione è lo stesso del comportamento del clone, tranne che il clone è congelato.

Se viene richiesta una clonazione profonda, tutti gli oggetti clonati SharedTable vengono congelati.

Parametri

L'oggetto SharedTable da clonare.

deep: boolean

Se creare un clone profondo ( true ) o un clone superficiale ( false ).

Valore predefinito: false

Restituzioni

increment

Aumenta atomicamente il valore di un elemento.Un elemento con la chiave specificata deve esistere nel SharedTable, e deve essere di tipo number.Il delta viene aggiunto al valore e viene restituito il valore originale.

La funzione SharedTable.update può essere utilizzata anche a questo scopo; questa funzione increment esiste per comodità e prestazioni (in Generale, increment è molto più veloce di update, quindi dovrebbe essere preferita dove possibile).Le seguenti due chiamate di funzione hanno lo stesso effetto:


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)

Se il SharedTable è congelato, l'operazione fallisce e verrà sollevata un'errore.

Parametri

L'oggetto SharedTable da aggiornare.

key: string | number

La chiave dell'elemento nell'oggetto SharedTable da aggiornare.

delta: number

Il valore da aggiungere all'elemento in SharedTable .

Restituzioni

Il valore originale dell'elemento, prima che delta fosse aggiunto ad esso.

Campioni di codice

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

Restituisce true se il SharedTable è congelato (read-only).


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

Parametri

L'oggetto SharedTable il cui stato congelato deve essere interrogato.

Restituzioni

size

Restituisce il numero di elementi memorizzati nella tabella condivisa.Si noti che se altri script stanno modificando contemporaneamente la tabella condivisa, la dimensione restituita potrebbe non essere più corretta dopo il suo ritorno, poiché altri script possono aver aggiunto o rimosso elementi dalla tabella condivisa.


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

Parametri

L'oggetto SharedTable il cui dimension è da interrogare.

Restituzioni

update

()

Aggiorna atomicamente il valore di un elemento.

Quando un SharedTable è accessibile contemporaneamente da script in esecuzione in diversi contesti di esecuzione, è possibile che i loro accessi si mescolino in modo imprevedibile.A causa di ciò, il codice come il seguente è generalmente errato, poiché il valore potrebbe essere cambiato tra la lettura sulla prima linea e l'aggiornamento sulla seconda linea:


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

La funzione di aggiornamento rende possibile eseguire un aggiornamento atomico a un elemento.Prende una funzione che chiamerà con il valore attuale dell'elemento.La funzione può quindi calcolare e restituire il nuovo valore.Nota che la funzione può essere chiamata più volte se il SharedTable viene modificato contemporaneamente da altri script.

Se il SharedTable è congelato, l'operazione fallisce e verrà sollevata un'errore.

Parametri

L'oggetto SharedTable da aggiornare.

key: string | number

La chiave dell'elemento nell'oggetto SharedTable da aggiornare.

La funzione che verrà chiamata per calcolare il nuovo valore per l'elemento.

Restituzioni

()

Campioni di codice

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