SharedTable
*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.
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.
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()
Kembalikan baru, kosong SharedTable .
Kembalikan baru SharedTable berisi elemen yang setara dengan elemen di tabel Luau yang disediakan.
Fungsi
Menghapus semua elemen dari SharedTable .
Membuat dan mengembalikan klon dari SharedTable yang disediakan.
Membuat dan mengembalikan klon beku (hanya dibaca) dari SharedTable yang disediakan.
Menambahkan delta ke nilai dengan kunci yang disediakan dan mengembalikan nilai asli.
Kembalikan true jika SharedTable dibekukan (hanya dibaca).
Kembalikan jumlah elemen yang disimpan di SharedTable.
Memperbarui nilai dengan kunci yang disediakan melalui fungsi pembaruan yang disediakan.
Konstruktor
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 = 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")
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
clone
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.
Apakah untuk membuat klon mendalam ( true ) atau klon yang dangkal ( false ).
Memberikan nilai
Contoh Kode
Contoh kode ini membuat klon yang dangkal dari 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")
-- 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.
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.
Apakah untuk membuat klon mendalam ( true ) atau klon yang dangkal ( 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.
Kunci elemen dalam objek SharedTable yang akan diperbarui.
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().
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] = nilassert(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.
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().
local st = SharedTable.new()
st["x"] = "abcd"
SharedTable.update(st, "x", function(v)
assert(v == "abcd")
return v .. "e"
end)
assert(st["x"] == "abcde")