SharedTable
*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.
Reprezentuje strukturę danych podobną do tabeli, którą można udostępniać w różnych kontekstach wykonania. Chociaż można ją używać do różnych rodzajów ogólnego przechowywania danych, jest ona zaprojektowana specjalnie dla użycia z Parallel Luau, gdzie można ją używać do udostępniania stanu poprzez różne instancje Actor.
Są kilka sposobów na komunikację tabelami między skryptami. Jeden z nich to przechowywanie i odzyskiwanie obiektów SharedTable w Class.SharedTableRegistry . Rejestr umożliwia każdemu skryptowi w tym samym modelu dany
Podobnie jak w tabeli Luau, obiekt SharedTable przechowuje zestaw pary kluczowych parametrów. W przeciwieństwie do tabeli Luau, tylko wybrane rodzaje obiektów można zapisać w tabeli Udostępnym, podobnie jak inne ograniczenia, które znajdziesz w silniku Roblox.
Klucze muszą być (1) ciągiem lub (2) liczbą całkowitą mniejszą niż 2 32. Inne rodzaje kluczy nie są wspierane.
Wartości muszą mieć jeden z następujących typów:Boolean, Number, Vector, String, SharedTable lub serIALizowalny wpisywaćdanych. Umiejętność przechowywania SharedTable jako wartości w innym SharedTable pozwala na budowę złożonych struktur danych.
Obiekty Datatype.SharedTable są różni i różni Datatype.SharedTable obiekty nigdy nie porównują się równo, nawet jeśli mają treści, które porównują się równo.
Podobnie jak tabela Luau, obiekt SharedTable może być zamrożony, w którym przypadku jest czytelny tylko. Próbka zmodyfikowania zamrożonego SharedTable b
Przykłady kodu
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.
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.
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
Podsumowanie
Konstruktorzy
- new()
Zwraca nowy, pusty SharedTable .
Zwraca nowy SharedTable zawierający elementy równivalentne tym w dostarczanej tabeli Luau.
Funkcje
Usuwa wszystkie elementy z SharedTable .
Tworzy i zwraca klon dostarczonego SharedTable .
Tworzy i zwraca zamrożony kopiowany klon dostarczonego SharedTable .
Dodaje delta do wartości z dostarczonym kluczem i zwraca oryginalną wartość.
Wywraca true , jeśli SharedTable jest zamrożony (tylko do czytania).
Zwraca liczbę elementów przechowywanych w SharedTable .
Aktualizuje wartość za pomocą dostarczonej funkcji aktualizacji.
Konstruktorzy
new
Zwraca nowy SharedTable zawierający elementy równivalentne tym w dostarczanej tabeli Luau.
Jeśli dostarczony przez Luau tabela zawiera jakiekolwiek klucze lub wartości, które nie można zapisać w SharedTable , budowa SharedTable nie powiodła się. Zobacz podsumowanie na górze tej strony dla listy typów obiektów, które można zapisać
local t = {}t.x = 1t.y = 2t.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")
Uwaga, że w niektórych przypadkach może być pożądane, aby SharedTable było w SharedTableRegistry. Metoda Class.ShareTableRegistry:GetSharedTable() dostarcza wygodny sposób na zrobienie tego.
Parametry
Tabela Luau, która ma być przechowywana w nowym SharedTable .
Funkcje
clear
Atomowo usuwa wszystkie elementy z SharedTable .
Jeśli SharedTable jest zamrożony, operacja nie powiodła się i zostanie wygenerowany błąd.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)SharedTable.clear(st)assert(SharedTable.size(st) == 0)
Parametry
The SharedTable to czyścić.
Zwroty
clone
Tworzy klon SharedTable i zwraca klon.
Jeśli argument opcjonalny deep nie jest obecny, lub jeśli jest obecny i jego wartość jest false, to powstaje głęboki
Operacja klonowania jest atomowa, więc klon SharedTable będzie zawierał spójny zapis stanu w oryginalnym SharedTable , nawet jeśli jest on modyfikowany równocześnie z innymi skryptami.
Jeśli opcjonalny argument deep jest obecny i jego wartość jest true , to powstaje głęboki klon. głęboki klon kopiuje strukturę SharedTable obiektów, tak że nie ma stanu współdzielonego między oryginalnym 1> Datatype.SharedTable1> a klonem.
Klon każdego SharedTable w ramach grafy SharedTable obiektów jest atomowy, ale głęboki klon jako całości nie jest atomowy. Więc klon każdego Datatype.
Obiekt SharedTable kopiowany może być zamrożony (tylko do czytania) lub nie. Niezależnie od tego, kopiowane klony są nie zamrożone (i tym samym zmodyfikowalne). Aby stworzyć zamrożone klony, użyj funkcji SharedTable.cloneAndFreeze.
Aby pokazać różnicę między głębokim klonem a klonem głębokim, rozważ następujące przykłady. Pierwszy przykład tworzy głęboki klon, a drugi tworzy głęboki klon.
Parametry
Obiekt SharedTable do klonowania.
Czy chcesz stworzyć głęboki klon ( true ) czy shallowery klon ( false ).
Zwroty
Przykłady kodu
This code sample creates a shallow clone of a SharedTable.
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.
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
Tworzy zamrożony (tylko do czytania) klon Datatype.SharedTable i zwraca klon. Zachowanie tej funkcji jest tego samego jak zachowanie klonu, z wyjątkiem tego, że klon jest zamrożony.
Jeśli zostanie zgłoszony głęboki klon, wszystkie klonowane obiekty SharedTable zostaną zamrożone.
Parametry
Obiekt SharedTable do klonowania.
Czy chcesz stworzyć głęboki klon ( true ) czy shallowery klon ( false ).
Zwroty
increment
Atomowo zwiększa wartość elementu. Element z określonym kluczem musi istnieć w SharedTable , a musi być typu number . Wskazany delta jest dodany do wartości i jest ona zwracana.
Funkcja SharedTable.update może być również używana do tego celu; ta funkcja increment istnieje dla wygody i wydajności (ogólnerzecz biorąc, increment jest znacznie szybszy niż 1> aktualizacja1>, więc należy go preferować, gdy to możliwe). Dwa następne wezwania funkcji mają ten sam efekt:
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)
Jeśli SharedTable jest zamrożony, operacja nie powiodła się i zostanie wygenerowany błąd.
Parametry
Obiekt SharedTable do zaktualizowania.
Klucz do elementu w obiekcie SharedTable do aktualizacji.
Wartość do dodania do elementu w SharedTable .
Zwroty
Oryginalna wartość elementu, zanim delta został dodany do niego.
Przykłady kodu
This code sample demonstrates usage of SharedTable.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
Wywraca true , jeśli SharedTable jest zamrożony (tylko do czytania).
local st1 = SharedTable.new({"a", "b", "c"})assert(not SharedTable.isFrozen(st1))local st2 = SharedTable.cloneAndFreeze(st1)assert(SharedTable.isFrozen(st2))
Parametry
Obiekt SharedTable, który ma być zapytany o zamrożony stanie.
Zwroty
size
Zwraca liczbę elementów przechowywanych w SharedTable. Uwaga, że jeśli inne skrypty modyfikują SharedTable równocześnie, rozmiar zwracanych elementów może nie być już poprawny po ich zwróceniu, ponieważ inne skrypty mogły dodać lub usunąć elementy z SharedTable.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)st[2] = nilassert(SharedTable.size(st) == 2)
Parametry
Obiekt SharedTable, który ma być zapytany o rozmiar.
Zwroty
update
Atomowo aktualizuje wartość elementu.
Gdy SharedTable jest aktywnie wykorzystywany z różnych kontekstów wykonania, może dojść do nieoczekiwanego połączenia ich dostępu. Z tego powodu kod takich jak następujący jest generalnie nieprawidłowy, ponieważ wartość może się zmienić między czytaniem w pierwszej linii a aktualizacją w drugiej linii:
local oldValue = st["x"]st["x"] = oldValue .. ",x"
Funkcja aktualizacji umożliwia wykonanie atomowej aktualizacji dla elementu. Wymaga funkcji, która będzie wzywana z bieżącą wartością elementu. Funkcja może następnie obliczyć i zwrócić nową wartość. Uwaga, że funkcja może być nazwana wiele razy, jeśli SharedTable jest modyfikowana równocześnie z innymi skryptami.
Jeśli SharedTable jest zamrożony, operacja nie powiodła się i zostanie wygenerowany błąd.
Parametry
Obiekt SharedTable do zaktualizowania.
Klucz do elementu w obiekcie SharedTable do aktualizacji.
Funkcja, która zostanie wywołana do obliczenia nowej wartości dla elementu.
Zwroty
Przykłady kodu
This code sample demonstrates usage of SharedTable.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")