SharedTable

Tampilkan yang Tidak Digunakan Lagi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Menyajikan struktur data seperti tabel yang dapat dibagikan di konteks eksekusi. Meskipun dapat digunakan untuk berbagai jenis penyimpanan data umum, ia dirancang khusus untuk digunakan dengan Parallel Luau, di mana ia dapat digunakan untuk berbagi status di antara skrip yang diwarisi di berbagai Actor instans.

Ada beberapa cara idiomatik untuk berkomunikasi tabel bersama di antara skrip. Salah satu metode adalah menyimpan dan mengambil SharedTable objek di SharedTableRegistry . Registry memungkinkan setiap script dalam model data yang

Seperti tabel Luau, objek SharedTable menyimpan set item nilai kunci. Berbeda dengan tabel Luau, hanya jenis-jenis objek yang Anda pilih yang dapat disimpan di Tabel Shared, mirip dengan batasan lain yang dapat Anda temukan di mesin Roblox ini.

Kunci harus (1) menjadi (2) angka intinerator negatif kurang dari 2 32 . Jenis kunci lainnya tidak didukung.

Nilai harus memiliki salah satu dari berikut jenis:Boolean, Angka, Vector, Strings, SharedTable , atau ketikdata seriables. Kemampuan untuk menyimpan SharedTable sebagai nilai dalam SharedTable lainnya memungkinkan pembangunan struktur data yang terbungkus dan recursive.

SharedTable objek dibandingkan dan berbeda SharedTable objek tidak pernah berkesamaan, bahkan jika mereka memiliki konten yang akan berkesamaan.

Seperti tabel Luau, objek SharedTable mungkin dibekukan, di mana kasusnya hanya dibaca. Upaya untuk mengubah tabel beku SharedTable akan menghasilkan k

Contoh Kode

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

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.

Element Iteration

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

Rangkuman

Konstruktor

  • new()

    Mengembalikan SharedTable baru yang kosong.

  • new(t : table)

    Mengembalikan tabel baru SharedTable yang berisi elemen yang setara dengan elemen yang ada di tabel Luau yang disediakan.

Fungsi

Konstruktor

new

Mengembalikan SharedTable baru yang kosong.


local st = SharedTable.new()

new

Mengembalikan tabel baru SharedTable yang berisi elemen yang setara dengan elemen yang ada di tabel Luau yang disediakan.

Jika tabel Luau yang disediakan berisi kunci atau nilai yang tidak dapat disimpan di tabel SharedTable, pembangunan tabel SharedTable gagal. Lihat ringkasan di bagian atas halaman ini untuk daftar jenis objek yang dapat disimpan di tabel


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

Catat bahwa dalam beberapa kasus mungkin diinginkan untuk menyimpan <a href="/reference/engine/datatypes">Datatype.SharedTable</a> di <a href="/reference/engine/datatypes">Class.SharedTableregistry</a>. Metode <a href="https://developer.microsoft.com/en-us/microsoft-edge/microsoft-edge-desktop#download-section">Class.ShareTableregistry\ menyediakan cara yang mudah untuk melakukan ini.

Parameter

Tabel Luau cuaca yang elemennya akan disimpan di SharedTable baru.

Fungsi

clear

()

Secara atomik menghapus semua elemen dari SharedTable .

Jika SharedTable dibekukan, operasi gagal dan kesalahan akan diangkat.


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

Parameter

The SharedTable to hapus.

Memberikan nilai

()

Menciptakan klon dari SharedTable dan mengembalikan klon.

Jika argument opsional deep tidak hadir, atau jika itu hadir dan nilainya adalah false, maka klon miring hanya mengkop

Operasi klon rendah atom, jadi klon SharedTable akan mengandung snapshot konsisten dari status di asli SharedTable, bahkan jika itu diubah secara bersamaan dari skrip lain.

Jika argumental deep yang opsional ada dan nilainya adalah true, maka klon dalam kedalaman dibuat. Klon dalam kedalaman secara berurutan menyalin struktur dari SharedTable objek, sehingga tidak ada negara bersama di antara asli 1> Datatype.SharedTable1> dan klon.

Klon masing-masing SharedTable dalam grafis dari objek SharedTable adalah atom, tetapi klon dalam keseluruhan tidak atom. Oleh karena itu, klon masing

Objek SharedTable yang diklon mungkin dibekukan (hanya baca) atau tidak. Terlepas dari itu, klon yang baru saja dibuat tidak tidak dibekukan (dan dapat diubah). Untuk membuat klon yang dibekukan, gunakan fungsi SharedTable.cloneAndFreeze.

Untuk menunjukkan perbedaan antara klon rendah dan klon dalam, pertimbangkan sampel berikut. Sampel pertama ini menciptakan klon rendah dan kedua menciptakan klon dalam.

Parameter

Objek SharedTable untuk diklon.

deep: boolean

Apakah akan membuat klon dalam ( true ) atau klon permukaan ( false ).

Nilai Default: false

Memberikan nilai

Contoh Kode

This code sample creates a shallow clone of a SharedTable.

Shallow 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, 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.

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

Menciptakan klon (hanya baca) dari SharedTable dan mengembalikan klon. Perilaku fungsi ini sama dengan perilaku klon, kecuali bahwa klon dibekukan.

Jika klon dalam kedalaman diinta, maka semua objek SharedTable yang diklon dibekukan.

Parameter

Objek SharedTable untuk diklon.

deep: boolean

Apakah akan membuat klon dalam ( true ) atau klon permukaan ( false ).

Nilai Default: false

Memberikan nilai

increment

Meningkatkan nilai elemen secara atomik. Elemen dengan kunci yang ditentukan harus ada di SharedTable , dan itu harus menjadi jenis number . Elemen yang ditentukan delta ditambahkan ke nilai, dan nilai asli 1> number1> dikembalikan.

Fungsi SharedTable.update ini juga dapat digunakan untuk tujuan ini; fungsi ini increment ada untuk kenyamanan dan kinerja (umumnya, increment lebih cepat dari 1> update1>, jadi Anda harus memilih di mana mungkin). Dua fungsi panggilan berikut memiliki efek yang sama:


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)

Jika SharedTable dibekukan, operasi gagal dan kesalahan akan diangkat.

Parameter

Objek SharedTable yang harus diperbarui.

key: string | number

Kunci dari elemen dalam SharedTable objek untuk diperbarui.

delta: number

Nilai yang akan ditambahkan ke elemen dalam SharedTable .

Memberikan nilai

Nilai asli elemen, sebelum delta ditambahkan ke elemen.

Contoh Kode

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

Mengembalikan true jika SharedTable dibekuk (hanya baca).


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

Parameter

Objek SharedTable yang cuacanya harus dipertanyakan.

Memberikan nilai

size

Mengembalikan jumlah elemen yang disimpan di SharedTable. Catat bahwa jika script lain mengubah tabel bersamaan, ukuran yang dikembalikan mungkin tidak lagi benar setelah dikembalikan, karena script lain mungkin telah menambahkan atau menghapus elemen dari tabel Shared.


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

Parameter

Objek SharedTable yang ukurannya harus dipertanyakan.

Memberikan nilai

update

()

Secara atomik menghubungkan nilai elemen.

Ketika SharedTable diakses secara bersamaan dari skrip yang berjalan di konteks eksekusi yang berbeda, mungkin kesalahan akses mereka dapat bermuatan secara tidak terduga. Karena itu, kode seperti berikut umumnya salah, karena nilai mungkin telah berubah di antara pembaca di baris pertama dan pembaruan di baris kedua:


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

Fungsi update memungkinkan untuk melakukan update atomik ke elemen. Ini mengambil fungsi yang akan dipanggil dengan nilai saat ini elemen. Fungsi kemudian dapat menghitung dan mengembalikan nilai baru. Catat bahwa fungsi ini dapat dipanggil beberapa kali jika fungsi SharedTable diubah secara bersamaan dari skrip lain.

Jika SharedTable dibekukan, operasi gagal dan kesalahan akan diangkat.

Parameter

Objek SharedTable yang harus diperbarui.

key: string | number

Kunci dari elemen dalam SharedTable objek untuk diperbarui.

Fungsi yang akan dianggap untuk menghitung nilai baru untuk elemen.

Memberikan nilai

()

Contoh Kode

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