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.

Mewakili struktur data seperti meja yang dapat dibagikan di antara konteks eksekusi.Meskipun dapat digunakan untuk berbagai jenis penyimpanan data umum, itu dirancang khusus untuk digunakan dengan Parallel Luau, di mana dapat digunakan untuk berbagi status melintasi skrip yang diberi tugas di bawah berbagai Actor.

Ada beberapa cara idiomatik untuk berkomunikasi tabel bersama di antara skrip.Satu metode adalah untuk menyimpan dan memulihkan objek SharedTable di SharedTableRegistry.Registri memungkinkan skrip di model data yang sama mendapatkan atau mengatur SharedTable oleh nama.Metode lain adalah menggunakan Actor:SendMessage() untuk mengirimkan tabel bersama ke tabel lain Actor di dalam pesan.

Seperti tabel Luau, objek SharedTable menyimpan serangkaian pasangan elemen kunci-nilai.Tidak seperti tabel Luau, hanya jenis objek yang dipilih dapat disimpan di Tabel Berbagi, mirip dengan batasan lain yang akan Anda temukan di tempat lain di Roblox Engine.

Kunci harus (1) menjadi string atau (2) nomor bilangan negatif kurang dari 2 32. Jenis kunci lain tidak didukung.

Nilai harus memiliki salah satu dari jenis berikut: Boolean, Angka, Vektor, String, SharedTable , atau ketikdata serialisable.Kemampuan untuk menyimpan SharedTable sebagai nilai di dalam yang lain SharedTable memungkinkan konstruksi struktur data terkait dan recursif.

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

Seperti tabel Luau, objek SharedTable dapat dibekukan, dalam hal ini dibaca hanya.Upaya untuk memodifikasi beku SharedTable akan menyebabkan kesalahan.Sebuah beku SharedTable dapat dibuat pertama kali dengan membuat (tidak beku, dapat diubah) SharedTable dengan konten yang diinginkan, dan kemudian memanggil SharedTable.cloneAndFreeze() untuk membuat klon beku dari itu.

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

Lingkaran for dapat digunakan untuk mengulangi elemen dari SharedTable .Elemen dari SharedTable tidak diulang secara langsung.Sebagai gantinya, klon yang dangkal terbuat dari SharedTable , dan elemennya diulang. Ini dilakukan untuk memastikan bahwa pandangan konsisten dari SharedTable dipertahankan sepanjang iterasi.Dengan demikian, kedua dari berikut untuk loop memiliki perilaku yang sama.

Perhatikan bahwa ini berarti bahwa jika SharedTable diakses langsung dari dalam tubuh loop iterasi, statusnya mungkin tidak konsisten dengan status yang diamati melalui iterasi.

Urutan iterasi sebagian diberikan.Elemen dengan kunci numerik diulang sebelum elemen dengan kunci string.Elemen dengan kunci numerik diulang dalam urutan numerik menaik.Elemen dengan kunci string diulang dalam urutan yang tidak ditentukan.

Iterasi Elemen

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

Fungsi

Konstruktor

new

Kembalikan baru, kosong SharedTable .


local st = SharedTable.new()

new

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

Jika tabel Luau yang disediakan berisi kunci atau nilai yang tidak dapat disimpan di SharedTable, konstruksi SharedTable gagal.Lihat ringkasan di bagian atas halaman ini untuk daftar jenis objek yang dapat disimpan di SharedTable .Jika tabel Luau berisi tabel sebagai nilai, tabel itu diubah menjadi baru 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")

Perhatikan bahwa dalam beberapa kasus mungkin diinginkan untuk menyimpan SharedTable di SharedTableRegistry.Metode Class.ShareTableRegistry:GetSharedTable() memberikan cara yang nyaman untuk mencapai ini.

Parameter

Tabel Luau yang elemennya harus disimpan di baru SharedTable .

Fungsi

clear

()

Secara atom menghapus semua elemen dari SharedTable .

Jika SharedTable dibekukan, operasi gagal dan kesalahan akan dibangkitkan.


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

Parameter

The SharedTable untuk hapus.

Memberikan nilai

()

Membuat klon dari SharedTable dan mengembalikan klon.

Jika argumen opsional deep tidak hadir, atau jika hadir dan nilainya adalah false , maka klon yang dangkal dibuat.Klon yang dangkal hanya menyalin objek tingkat atas SharedTable .Jika nilai apa pun di dalam SharedTable sendiri adalah SharedTable , maka kedua asli SharedTable dan klon SharedTable akan merujuk pada yang sama SharedTable .

Operasi klon yang dangkal adalah atomik, jadi klon SharedTable akan berisi snapshot konsisten dari status di asli SharedTable, bahkan jika dimodifikasi secara bersamaan dari skrip lain.

Jika argumen opsional deep opsional hadir dan nilainya adalah true , maka klon mendalam dibuat.Klon mendalam secara berulang menyalin struktur dari SharedTable objek, sehingga tidak ada negara yang dibagikan antara asli SharedTable dan klon.

Klon dari setiap SharedTable dalam grafik objek SharedTable adalah atomik, tetapi klon mendalam sebagai keseluruhan tidak atomik.Dengan demikian, klon dari masing-masing dalam grafik akan berisi snapshot konsisten dari status objek asli yang telah di-kloning, tetapi negara-negara objek yang berbeda mungkin tidak konsisten jika grafik dimodifikasi secara bersamaan dari skrip lain.

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

Untuk mengilustrasikan perbedaan antara klon yang dangkal dan klon yang mendalam, pertimbangkan sampel berikut.Sampel pertama ini membuat klon yang dangkal dan yang kedua membuat klon yang mendalam.

Parameter

Objek SharedTable yang harus diklon.

deep: boolean

Apakah untuk membuat klon mendalam ( true ) atau klon yang dangkal ( false ).

Nilai Default: false

Memberikan nilai

Contoh Kode

Contoh kode ini membuat klon yang dangkal dari SharedTable.

Klon Dalam Halusinasi

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")
-- Karena ini adalah klon yang dangkal, original ["c"] dan klon ["c"] adalah
-- objek Tabel Berbagi yang sama.
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

Membuat klon beku (hanya dibaca) dari SharedTable dan mengembalikan klon.Perilaku fungsi ini sama dengan perilaku klon, kecuali klon dibekukan.

Jika klon mendalam diminta, maka semua objek klon SharedTable dibekukan.

Parameter

Objek Tabel Berbagi untuk diklon.

deep: boolean

Apakah untuk membuat klon mendalam ( true ) atau klon yang dangkal ( false ).

Nilai Default: false

Memberikan nilai

increment

Meningkatkan nilai elemen secara atomik.Elemen dengan kunci yang ditentukan harus ada di SharedTable , dan harus berjenis number .Yang ditentukan delta ditambahkan ke nilai, dan nilai asli dikembalikan.

Fungsi SharedTable.update dapat juga digunakan untuk tujuan ini; fungsi ini increment ada untuk kenyamanan dan kinerja (pada umumnya, increment jauh lebih cepat dari update, jadi seharusnya dipilih di mana mungkin).Dua panggilan fungsi 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 dibangkitkan.

Parameter

Objek SharedTable yang akan diperbarui.

key: string | number

Kunci elemen dalam objek SharedTable yang akan diperbarui.

delta: number

Nilai yang harus ditambahkan ke elemen di SharedTable .

Memberikan nilai

Nilai asli elemen, sebelum delta ditambahkan ke dalamnya.

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

Kembalikan true jika SharedTable dibekukan (hanya dibaca).


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 statusnya dibekukan untuk ditanyakan.

Memberikan nilai

size

Kembalikan jumlah elemen yang disimpan di Tabel Berbagi.Perhatikan bahwa jika skrip lain secara bersamaan memodifikasi Tabel Berbagi, ukuran yang dikembalikan mungkin tidak lagi benar setelah dikembalikan, karena skrip lain mungkin telah menambahkan atau menghapus elemen dari Tabel Berbagi.


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 memperbarui nilai elemen.

Ketika SharedTable diakses secara bersamaan dari skrip yang berjalan di konteks eksekusi yang berbeda, mungkin bagi akses mereka untuk bercampur tak terduga.Karena ini, kode seperti berikut umumnya tidak benar, karena nilainya mungkin telah berubah antara membaca di baris pertama dan pembaruan di baris kedua:


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

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

Jika SharedTable dibekukan, operasi gagal dan kesalahan akan dibangkitkan.

Parameter

Objek SharedTable yang akan diperbarui.

key: string | number

Kunci elemen dalam objek SharedTable yang akan diperbarui.

Fungsi yang akan dipanggil 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")