다양한 종류의 일반 데이터 저장소에 대해 공유할 수 있는 테이블 같은 데이터 구조를 나타냅니다. 일반적인 데이터 저장소에 대해 다양한 종류의 일반 데이터 저장소를 사용할 수 있지만, 병렬 Luau에서는 다양한 종류의 스크립트에 대해 상태를 공유하기 위해 특별히
스크립트 간에 공유 테이블을 통신하는 몇 가지 이디엄 방법이 있습니다. 하나의 방법은 레이리를 사용하여 모든 스크립트에서 SharedTable 개체를 저장하고
Luau 테이블과 마찬가지로, SharedTable 개체는 키 값 쌍의 집합을 저장합니다. Luau 테이블과는 달리, 선택한 개체 유형만 공유 테이블에 저장할 수 있습니다. 다른 제한은 Roblox 엔진의 다른 위치에서 찾을 수 있습니다.
열은 (1) 문자열이거나 (2) 2 32 미만의 부정 수 이하여야 합니다. 다른 종류의 열은 지원되지 않습니다.
값은 다음 형식 중 하나여야 합니다.Boolean, Number, Vector, String, SharedTable , 또는 직렬 가능한 데이터 입력.SharedTable 를 다른 형식의 값으로 저장할 수 있는 능력은 중첩 및 재귀 데이터 구조를 구축하는 데 유용합니다.
SharedTable 개체는 서로 다른 SharedTable 개체가 쌍수를 비교하지 않습니다.
Luau 테이블과 마찬가지로, SharedTable 개체는 얼어붙을 수 있습니다. 얼어붙은 읽기 전용이므로 수정할 수 없습니다
코드 샘플
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
요약
생성자
- new()
새로운, 비어있는 SharedTable 을 반환합니다.
제공된 Luau 테이블과 동일한 요소를 포함하는 새로운 SharedTable를 반환합니다.
함수
Datatype.SharedTable 에서 모든 요소를 제거합니다.
제공된 클래스 내 하나의 복제본을 만들고 SharedTable 을 반환합니다.
제공된 SharedTable 의 얼어붙은 복사본을 생성하고 반환합니다.
원본 값과 키가 지정된 값에 대해 delta 를 추가하고 원래 값을 반환합니다.
Datatype.SharedTable이 얼어붙으면(읽기 전용) SharedTable를 반환합니다.
Datatype.SharedTable 에 저장된 요소의 수를 반환합니다.
제공된 업데이트 함수를 통해 값을 업데이트합니다.
생성자
new
제공된 Luau 테이블과 동일한 요소를 포함하는 새로운 SharedTable를 반환합니다.
Luau 테이블에 저장할 수 없는 키 또는 값이 포함된 경우 이 페이지의 상단에 있는 개체 목록에 대한 참조를 참조하십시오. 이 페이지의 상단에 있는 개체 목록에 대한 참조는 개체 목록의 형
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")
일부 경우 SharedTable 을 SharedTableRegistry 에 저장하는 것이 좋습니다. Class.ShareTableRegistry:GetSharedTable() 메서드는 이를 수행하는 편리한 방법을 제공합니다.
매개 변수
새로운 SharedTable 에 저장될 요소가 있는 Luau 테이블입니다.
함수
clear
Atomically removes all of the elements from a SharedTable .
Datatype.SharedTable이 얼어붙으면 작업이 실패하고 오류가 발생합니다.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)SharedTable.clear(st)assert(SharedTable.size(st) == 0)
매개 변수
지우다SharedTable입니다.
반환
clone
클론 SharedTable 및 클론을 반환합니다.
옵션적인 deep 인수가 없거나 값이 false 인 경우 경우 경우 경우 경우 경우 경우
클론 작업은 원자적이므로 클론 SharedTable 에 원시 상태의 상태 캐럿을 포함하도록 하면 다른 스크립트에서 클론을 수정하더라도 클론의 상태를 원시 상태로 유지할 수 있습니다.
옵션적인 deep 인수가 있으면 값이 true인 경우 깊은 클론이 생성됩니다. 깊은 클론은 SharedTable 개체의 구조를 복제하여 원래 2>Datatype.SharedTable2>와 클론 사이에 상태가 공유되지 않습니다.
그래프 내의 SharedTable 개체 내의 각 SharedTable 클론의 크기는 원자이지만 클론 전체의 크기는 원자가 아닙니다.
클론되는 개체 SharedTable 개체(s)는 얼어붙을 수도 있습니다(잠금 읽기 전용). 어느 쪽이든, 새로 생성된 클론은 얼어붙지 않습니다 (즉, 수정할 수 있습니다). 얼어붙으려면 Datatype.SharedTable.cloneAndFreeze
높은 수준의 클론과 낮은 수준의 클론의 차이를 보여주려면 다음 샘플을 참조하십시오. 첫 번째 샘플은 높은 수준의 클론을 만들고 두 번째는 낮은 수준의 클론을 만듭니다.
매개 변수
클론할 SharedTable 개체.
깊은 복제본( true )또는 shallower 복제본( false )을 만듭니다.
코드 샘플
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
Datatype.SharedTable의 얼어붙은 복사본을 만들고 복사본을 반환합니다. 이 함수의 동작은 클론과 동일하지만, 복사본이 얼어붙습니다.
깊은 복제본이 요청된 경우, 복제된 모든 SharedTable 개체가 얼어붙습니다.
매개 변수
공유 테이블 개체를 클론합니다.
깊은 복제본( true )또는 shallower 복제본( false )을 만듭니다.
increment
원자 증가 요소의 값. 지정된 키가 있는 요소는 SharedTable 에 있어야 하며 형식은 number 이어야 합니다. 지정된 delta 는 값에 추가되고 원래 값은 반환됩니다.
이 목적을 위해 SharedTable.update 함수도 사용할 수 있습니다; 이 increment 함수는 편의 및 성능을 위해 존재합니다(일반적으로 increment 은 1> 업데이트1> 보다 훨씬 더 빠르므로, 가능하면 이 두 함수 호출을 사용하는 것
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)
Datatype.SharedTable이 얼어붙으면 작업이 실패하고 오류가 발생합니다.
매개 변수
업데이트할 SharedTable 개체.
Datatype.SharedTable의 요소에 추가할 값입니다.
반환
delta를 추가하기 전의 원래 값입니다.
코드 샘플
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
Datatype.SharedTable이 얼어붙으면(읽기 전용) SharedTable를 반환합니다.
local st1 = SharedTable.new({"a", "b", "c"})assert(not SharedTable.isFrozen(st1))local st2 = SharedTable.cloneAndFreeze(st1)assert(SharedTable.isFrozen(st2))
매개 변수
얼어붙은 상태인 SharedTable 개체.
반환
size
공유 테이블에 저장된 요소의 수를 반환합니다. 다른 스크립트가 공유 테이블을 동시에 수정하는 경우 반환된 크기는 다시 반환된 후 정확하지 않을 수 있습니다. 다른 스크립트가 공유 테이블에서 요소를 추가하거나 제거하기 때문입니다.
local st = SharedTable.new({"a", "b", "c"})assert(SharedTable.size(st) == 3)st[2] = nilassert(SharedTable.size(st) == 2)
매개 변수
크기를 지정할 SharedTable 개체.
반환
update
원자적으로 요소의 값을 업데이트합니다.
다른 실행 컨텍스트에서 실행되는 스크립트에서 SharedTable 에 대한 액세스가 동시에 수행되면 액세스가 예측 가능하게 엉망 날 수 있습니다. 이로 인해 코드 같은 다음이 일반적으로 잘못되는 이유는 값이 첫 번째 줄에서 읽을 때 변경된 후 두 번째 줄에
local oldValue = st["x"]st["x"] = oldValue .. ",x"
업데이트 함수는 요소에 원자 업데이트를 수행할 수 있게 합니다. 이는 현재 요소의 값과 함수를 호출하는 함수입니다. 함수는 다른 스크립트에서 SharedTable 이 수행 중인 경우 계산 및 반환할 새 값을 계산할 수 있습니다. 함수는 여러 번 호출될 수 있습니다.
Datatype.SharedTable이 얼어붙으면 작업이 실패하고 오류가 발생합니다.
매개 변수
업데이트할 SharedTable 개체.
요소에 대한 새로운 값을 계산하는 함수입니다.
반환
코드 샘플
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")