SharedTable

사용되지 않는 항목 표시

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

실행 컨텍스트 간에 공유할 수 있는 테이블 같은 데이터 구조를 나타냅니다.다양한 종류의 일반 데이터 저장소로 사용할 수는 있지만, 평행 Luau 에서 사용하도록 특별히 설계되었으며, 여기에서 상위 인스턴스에 속한 스크립트 간에 상태를 공유할 수 있습니다.

스크립트 간에 공유 테이블을 통신하는 데 사용할 수 있는 몇 가지 비유적 방법이 있습니다.하나의 방법은 SharedTable 개체를 SharedTableRegistry에 저장하고 검색하는 것이다.레지스트리는 동일한 데이터 모델의 모든 스크립트가 이름으로 SharedTable 를 가져오거나 설정할 수 있도록 합니다.또 다른 방법은 공유 테이블을 메시지 내부의 다른 Actor:SendMessage()에 보내기 위해 Actor를 사용하는 것입니다.

Luau 테이블과 마찬가지로, SharedTable 개체는 키-값 요소 쌍 집합을 저장합니다.Luau 테이블과 달리, SharedTable에는 다른 Roblox 엔진에서 찾을 수 있는 다른 제한과 마찬가지로 선택된 개체 유형만 저장될 수 있습니다.

키는 (1) 문자열이거나 (2) 2보다 작은 음의 정수 숫자여야 합니다(32 32 ). 다른 종류의 키는 지원되지 않습니다.

값은 다음 유형 중 하나여야 합니다: Boolean, Number, Vector, String, SharedTable 또는 직렬화 가능한 데이터 입력.다른 SharedTable 에서 값으로 저장할 수 있는 SharedTable 능력은 중첩되고 재귀적인 데이터 구조의 건설을 허용합니다.

SharedTable 개체는 구별되고 다르며 SharedTable 개체는 동일한 내용이 있더라도 동일하게 비교되지 않습니다.

Luau 테이블과 마찬가지로, SharedTable 개체는 얼어붙을 수 있으며, 이 경우 읽기 전용입니다.동결된 SharedTable를 수정하려는 시도는 오류를 발생시킵니다.냉동된 SharedTable 을 먼저 원하는 콘텐츠로 (냉동되지 않고 수정 가능) SharedTable 을 만들고, 그런 다음 SharedTable.cloneAndFreeze() 를 호출하여 냉동된 복제본을 만들 수 있습니다.

코드 샘플

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

for 루프는 요소를 반복하기 위해 SharedTable에서 사용할 수 있습니다.SharedTable의 요소는 직접 반복되지 않습니다.대신, 얕은 복제본은 SharedTable 에서 만들어지고 해당 요소가 반복됩니다.이는 반복 중에 일관된 보기가 유지되도록 하기 위해 수행됩니다 SharedTable .따라서 루프의 다음 둘 모두 동일한 동작을 가집니다.

이것은 반복 루프의 본문에서 SharedTable에 직접 액세스하면 상태가 반복을 통해 관찰된 상태와 일치하지 않을 수 있음을 의미합니다.

반복 순서가 부분적으로 지정됩니다.숫자 키가 있는 요소는 문자열 키가 있는 요소보다 먼저 반복됩니다.숫자 키가 있는 요소는 순차적으로 증가하는 숫자 순서로 반복됩니다.문자열 키가 있는 요소는 지정되지 않은 순서로 반복됩니다.

요소 반복

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 를 반환합니다.


local st = SharedTable.new()

new

제공된 Luau 테이블의 요소와 동일한 새로운 SharedTable를 반환합니다.

제공된 Luau 테이블에 저장할 수 없는 키 또는 값이 포함되어 있으면 SharedTable에 구축된 SharedTable가 실패합니다.이 페이지 상단의 요약에서 SharedTable에 저장할 수 있는 개체 유형 목록을 참조하십시오.Luau 테이블에 값으로 테이블이 포함되어 있으면 해당 테이블이 새로운 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")

일부 경우에는 저장소에 SharedTable를 저장하는 것이 바람직할 수 있습니다. SharedTableRegistry에서.Class.ShareTableRegistry:GetSharedTable() 메서드는 이를 수행하는 편리한 방법을 제공합니다.

매개 변수

요소가 새로운 SharedTable에 저장될 Luau 테이블.

함수

clear

()

원자적으로 모든 요소를 SharedTable에서 제거합니다.

SharedTable가 동결되면 작업이 실패하고 오류가 발생합니다.


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

매개 변수

지우다위한 SharedTable .

반환

()

클론의 SharedTable 복사본을 생성하고 클론을 반환합니다.

선택적 deep 인수가 없거나, 있더라도 값이 false 인 경우 얕은 복제본이 생성됩니다.얕은 복제는 상위 수준의 SharedTable 개체만 복사합니다.SharedTable 자체의 모든 값이 SharedTable 인 경우 원래의 SharedTable 및 클론의 SharedTable 모두 동일한 SharedTable 에 참조합니다.

얕은 복제 작업은 원자적이므로 클론 SharedTable 은 다른 스크립트에서 동시에 수정되더라도 원래 SharedTable 의 상태에 대한 일관된 스냅샷을 포함합니다.

선택적 deep 인수가 존재하고 값이 true 인 경우 깊은 복제본이 생성됩니다.깊은 복제는 원래의 SharedTable 와 클론 사이에 공유되는 상태가 없는 구조의 SharedTable 개체를 재귀적으로 복사합니다.

그래프의 각 개체 내의 클론은 원자적이지만, 전체 깊은 클론은 원자적이지 않습니다.따라서 그래프 내의 각 SharedTable 클론에는 복제된 원래 SharedTable 개체의 상태에 대한 일관된 스냅샷이 포함되지만, 그래프가 다른 스크립트에서 동시에 수정되는 경우 다른 SharedTable 개체의 상태가 일관되지 않을 수 있습니다.

복제 중인 SharedTable 개체(들)가 얼어붙을 수도 있고 그렇지 않을 수도 있습니다.어쨌든 새로 생성된 클론은 *얼지 않았습니다 (따라서 수정할 수 있음)*이며동결된 클론을 생성하려면 SharedTable.cloneAndFreeze 함수를 사용하십시오.

얕은 복제와 깊은 복제의 차이를 보여주기 위해, 다음 샘플을 고려하십시오.이 첫 번째 샘플은 얕은 복제본을 만들고 두 번째는 깊은 복제본을 만듭니다.

매개 변수

복제할 개체 SharedTable .

deep: boolean

깊은 복제(true) 또는 얕은 복제(false)를 생성할지 여부

기본값: false

코드 샘플

이 코드 샘플은 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")
-- 이것이 얕은 복제였기 때문에 original["c"]와 clone["c"]는
-- 동일한 공유 테이블 개체.
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

의 얼어붙은 (읽기 전용) 클론을 생성하고 클론을 반환합니다.이 함수의 동작은 클론이 동결된 것을 제외하고 클론의 동작과 동일합니다.

깊은 복제가 요청되면 모든 복제된 SharedTable 개체가 동결됩니다.

매개 변수

복제할 SharedTable 개체.

deep: boolean

깊은 복제(true) 또는 얕은 복제(false)를 생성할지 여부

기본값: false

increment

원자적으로 요소의 값을 증가시킵니다.지정된 키가 있는 요소는 SharedTable에 존재해야 하며, 유형은 number여야 합니다.지정된 delta 는 값에 추가되고 원래 값이 반환됩니다.

SharedTable.update 함수는 이 목적으로도 사용할 수 있으며, 이 increment 함수는 편의와 성능을 위해 존재합니다(일반적으로 incrementupdate 보다 훨씬 빠르므로 가능하면 선호되어야 함).다음 두 함수 호출은 동일한 효과가 있습니다:


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)

SharedTable가 동결되면 작업이 실패하고 오류가 발생합니다.

매개 변수

업데이트할 SharedTable 개체.

key: string | number

업데이트할 SharedTable 개체의 요소 키.

delta: number

SharedTable 요소에 추가할 값.

반환

delta 가 추가되기 전의 요소의 원래 값.

코드 샘플

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

trueSharedTable 가 동결되면 반환합니다(읽기 전용).


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] = nil
assert(SharedTable.size(st) == 2)

매개 변수

크기가 쿼리될 대상인 SharedTable 개체.

반환

update

()

원자적으로 요소의 값을 업데이트합니다.

서로 다른 실행 컨텍스트에서 동시에 실행되는 스크립트에서 SharedTable에 액세스할 때, 액세스가 예측할 수 없게 교차할 수 있습니다.따라서 다음과 같은 코드는 값이 첫 번째 줄에서 읽고 두 번째 줄에서 업데이트되었기 때문에 일반적으로 잘못됩니다:


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

업데이트 함수를 통해 요소에 원자적 업데이트를 수행할 수 있습니다.요소의 현재 값으로 호출할 함수가 필요합니다.그런 다음 함수는 새 값을 계산하고 반환합니다.함수는 다른 스크립트에서 동시에 수정되는 경우 SharedTable가 여러 번 호출될 수 있다는 점에 유의하십시오.

SharedTable가 동결되면 작업이 실패하고 오류가 발생합니다.

매개 변수

업데이트할 SharedTable 개체.

key: string | number

업데이트할 SharedTable 개체의 요소 키.

요소의 새 값을 계산하기 위해 호출될 함수.

반환

()

코드 샘플

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