SharedTable
*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.
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.
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.
Mengembalikan tabel baru SharedTable yang berisi elemen yang setara dengan elemen yang ada di tabel Luau yang disediakan.
Fungsi
Hapus semua elemen dari SharedTable .
Menciptakan dan mengembalikan klon dari SharedTable yang disediakan.
Menciptakan dan mengembalikan klon (hanya baca) dari SharedTable yang disediakan.
Menambahkan delta ke nilai dengan kunci yang disediakan dan mengembalikan nilai asli.
Mengembalikan true jika SharedTable dibekuk (hanya baca).
Mengembalikan jumlah elemen yang disimpan di SharedTable .
Meng更新值与提供的钥匙 via fungsi pembaruan yang disediakan.
Konstruktor
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 = 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")
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
clone
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.
Apakah akan membuat klon dalam ( true ) atau klon permukaan ( false ).
Memberikan nilai
Contoh Kode
This code sample creates a shallow 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, 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.
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.
Apakah akan membuat klon dalam ( true ) atau klon permukaan ( 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.
Kunci dari elemen dalam SharedTable objek untuk diperbarui.
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().
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] = nilassert(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.
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().
local st = SharedTable.new()
st["x"] = "abcd"
SharedTable.update(st, "x", function(v)
assert(v == "abcd")
return v .. "e"
end)
assert(st["x"] == "abcde")