SharedTable
*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。
実行コンテキスト間で共有できるテーブルのようなデータ構造を表現します。様々な種類の一般的なデータストレージとして使用できますが、Parallel Luau で特に設計され、異なる Actor インスタンスの下に属するスクリプト間で状態を共有することができます。
スクリプト間で共有テーブルをコミュニケートするのに便利ないくつかの表現方法があります。1つの方法は、SharedTable オブジェクトを SharedTableRegistry に保存して回収することです。レジストリは、同じデータモデルの任意のスクリプトが名前で SharedTable を取得または設定できるようにします。別の方法は、Actor:SendMessage() を使用して、メッセージ内の別の Actor に共有テーブルを送信することです。
Luau テーブルと同様、SharedTable オブジェクトは、キー-値エレメントペアのセットを保存します。Luau テーブルとは異なり、共有テーブルには、Roblox エンジンの他の制限と同様、選択されたオブジェクトの種類のみが保存できます。
キーは (1) 文字列か (2) 2 32 以下の非ネガティブ整数番号である必要があります。他の種類のキーはサポートされない。
値は次のタイプの 1つでなければなりません: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.
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 を返します。
提供された Luau テーブルの要素と同等の新しい SharedTable を返します。
関数
すべての要素を SharedTable から削除します。
提供された SharedTable のクローンを作成して返します。
提供された SharedTable の凍結 (読み込み専用) クローンを作成し、返します。
提供されたキーで値に delta を追加し、元の値を返します。
true が凍結 (読み取り専用) されている場合、SharedTable を返します。
SharedTable に保存された要素の数を返します。
提供された更新機能を介して、提供されたキーで値を更新します。
コンストラクタ
new
提供された Luau テーブルの要素と同等の新しい SharedTable を返します。
提供された Luau テーブルに SharedTable に保存できないキーや値が含まれている場合、SharedTable の構築に失敗します。このページの上部にある概要を見て、SharedTable に保存できるオブジェクトの種類のリストを見てください。Luau テーブルに値としてテーブルが含まれている場合、そのテーブルは新しい SharedTable に変換されます。
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
アトミックに、SharedTable からすべての要素を削除します。
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 オブジェクトのみをコピーします。If any value in the SharedTable itself is a SharedTable , then both the original SharedTable and the clone SharedTable will refer to the same SharedTable .
浅いクローン操作はアトミックであるため、クローン SharedTable には、他のスクリプトから同時に修正されているにもかかわらず、オリジナルの SharedTable の状態の一貫したスナップショットが含まれます。
オプションの deep 引数が存在し、その値が true である場合、深いクローンが作成されます。深いクローンは、SharedTable オブジェクトの構造を再帰的にコピーし、オリジナルの SharedTable とクローンの間で共有される状態がないようにします。
グラフ内の各 オブジェクトのクローンは原子ですが、深いクローン全体は原子ではありません。たとえば、グラフ内の各 SharedTable のクローンには、クローンされたオリジナルの SharedTable オブジェクトの一貫したスナップショットが含まれますが、グラフが他のスクリプトで同時に修正されている場合、異なる SharedTable オブジェクトの状態が不一致する可能性があります。
クローンされている SharedTable オブジェクト(s)は、フリーズされるか、そうでないかもしれません。どちらにしても、新たに作成されたクローンは 凍結されていない (そしてそれらは変更可能)。凍結クローンを作成するには、SharedTable.cloneAndFreeze 関数を使用します。
浅いクローンと深いクローンの違いを示すために、次のサンプルを考えてください。この最初のサンプルは浅いクローンを作成し、2番目は深いクローンを作成します。
パラメータ
クローンする SharedTable オブジェクト。
深いクローン ()または浅いクローン ()を作成するかどうか。
戻り値
コードサンプル
このコードサンプルは、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.
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 オブジェクトが凍結します。
パラメータ
クローンする共有テーブルオブジェクト。
深いクローン ()または浅いクローン ()を作成するかどうか。
戻り値
increment
アトミックに要素の値を増加します。指定されたキーを持つ要素は、SharedTable で存在し、タイプは number でなければなりません。指定された delta は値に追加され、元の値が返されます。
この目的でも SharedTable.update 関数を使用できます;この increment 関数は便利性とパフォーマンスのために存在します (一全般に、increment は update よりもはるかに速いので、可能な限り優先する必要があります)。次の 2 つの機能呼び出しは同じ効果があります:
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 が凍結された場合、操作に失敗してエラーが発生します。
パラメータ
戻り値
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
true が凍結 (読み取り専用) されている場合、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 のアクセスが予測できない形で交差する可能性があります。このため、次のようなコードは一般的に間違っています、値が最初の行で読み込まれてから、2番目の行で更新される可能性があるため:
local oldValue = st["x"]st["x"] = oldValue .. ",x"
アップデート機能により、要素にアトミックアップデートを実行できます。現在の要素の値で呼び出す機能が必要です。その後、機能は新しい値を計算して返します。注: 機能は、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")