SharedTable

Artık kullanılmayanları göster

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

İnfaz bağlamları arasında paylaşılabilen masa benzeri bir veri yapısını temsil eder.Çeşitli genel veri depolama türleri için kullanılabilirken, özellikle Paralel Luau ile kullanılmak üzere tasarlanmıştır, burada farklı örnekler altında yer alan kodlar arasında durum paylaşımı yapılabilir.

Senaryolar arasında paylaşılan tabloları iletişim kurmanın birkaç idiomatik yolu vardır.Bir yöntem, SharedTable nesnelerini SharedTableRegistry 'de saklayıp almaktır.Rejestr, aynı veri modelindeki herhangi bir kriptin adıyla bir SharedTable almasına veya ayarlanmasına izin verir.Bir başka yöntem, bir mesajın içindeki başka bir Actor:SendMessage() paylaşılan tablo göndermek için Actor kullanmaktır.

Bir Luau tablosu gibi, bir SharedTable nesnesi bir dizi anahtar-değer eleman çifti saklar.Bir Luau tablosundan farklı olarak, yalnızca Roblox Motorunda başka yerlerde bulacağınız diğer kısıtlamalara benzer şekilde, yalnızca seçilen nesne türleri paylaşılan bir tabloda depolanabilir.

Anahtarlar ya (1) bir dize ya da (2) 2 32 daha az negatif bir sayı olmalıdır. Diğer anahtar türleri desteklenmez.

Değerler aşağıdaki türlerden birine sahip olmalıdır: Boolean, Number, Vector, String, SharedTable veya seri hale getirilebilir bir veri yaz.Bir değer olarak bir SharedTable başka bir SharedTable içinde saklama yeteneği, çekici ve yürütülebilir veri yapılarının oluşturulmasına izin verir.

SharedTable nesneler farklı ve farklıdır SharedTable nesneler asla eşit karşılaştırılmaz, eşit içeriklere sahip olmalarına rağmen.

Bir Luau tablosu gibi, bir SharedTable nesne dondurulabilir ve bu durumda okunur yalnızca.Donmuş bir SharedTable 'i değiştirme girişimi bir hata yükleyecektir.Donmuş bir SharedTable dondurulmuş olmayan, değiştirilebilir bir SharedTable oluşturularak ilk oluşturulabilir ve ardından donmuş bir klon oluşturmak için SharedTable.cloneAndFreeze() çağrılır.

Kod Örnekleri

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

Özet

Yapılandırıcılar

İşlevler

Yapılandırıcılar

new

Yeni ve boş bir SharedTable.


local st = SharedTable.new()

new

Verilen Luau tablosundaki öğelere eşdeğer olan yeni bir SharedTable döndürür.

Verilen Luau tablosunda SharedTable depolanamayacak herhangi bir anahtar veya değer bulunuyorsa, SharedTable inşası başarısız olur.Bu sayfanın üst kısmındaki özeti, SharedTable içine depolanabilecek nesne türlerinin bir listesini görün.Luau tablosu bir değer olarak herhangi bir tablo içeriyorsa, o tablo yeni bir SharedTable olarak dönüştürülür.


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

Bazı durumlarda bir SharedTable 'yi SharedTableRegistry 'de saklamak istenebilir olduğunu unutmayın.The Class.ShareTableRegistry:GetSharedTable() yöntemi bunu başarmak için uygun bir yol sağlar.

Parametreler

Öğeleri yeni SharedTable 'de saklanacak olan Luau tablosu.

İşlevler

clear

()

Atomik olarak tüm elemanları bir SharedTable 'dan kaldırır.

Eğer SharedTable dondurulursa, operasyon başarısız olur ve bir hata yükseltilir.


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

Parametreler

temizleiçin SharedTable .

Dönüşler

()

Bir SharedTable klonunu oluşturur ve klonu geri döndürür.

Opsiyonel deep argümanı mevcut değilse veya mevcut ve değeri false ise, yüzeysel bir klon oluşturulur.Yüzeysel bir klon sadece üst düzey SharedTable nesneyi kopyalar.Eğer SharedTable içindeki herhangi bir değer bir SharedTable ise, hem orijinal SharedTable hem de klon SharedTable aynı SharedTable referans edecektir.

Yüzeysel klonlama işlemi atomiktir, bu nedenle klon SharedTable , orijinal SharedTable 'deki durumun tutarlı bir kopyasını içerecektir, yani aynı anda diğer kodlardan değiştirilse bile.

Eğer seçici deep argümanı mevcut ve değeri true ise, derin bir klon oluşturulur.Derin bir klon, SharedTable nesneler arasında paylaşılan bir devlet olmadığı için orijinal SharedTable ve klon arasında paylaşılan bir yapıyı yeniden yazar.

Grafikteki her nesnenin klonu atomiktir, ancak derin klon bütünü atomik değildir.Dolayısıyla, grafik içindeki her bir SharedTable klonu, kopyalanan orijinal SharedTable nesnenin durumuna ilişkin tutarlı bir görüntü içerecek, ancak farklı SharedTable nesnelerin durumları eşzamanlı olarak değiştiriliyorsa grafikten diğer senaryolardan modifiye edilirse tutarsız olabilir.

Klonlanan SharedTable nesne(ler) dondurulabilir (sadece okuma) veya olmayabilir.Her durumda, yeni oluşturulan klonlar dondurulmuyor (ve bu nedenle değiştirilebilir).Donmuş klonlar oluşturmak için, SharedTable.cloneAndFreeze işlevini kullanın.

Derin bir klon ve yüzeysel bir klon arasındaki farkı göstermek için, aşağıdaki örnekleri düşünün.Bu ilk örnek yüzeysel bir klon oluşturur ve ikincisi derin bir klon oluşturur.

Parametreler

Klonlanacak SharedTable nesne.

deep: boolean

Derin bir klon oluşturmak ( true ) veya yüzeysel bir klon oluşturmak ( false ).

Varsayılan değer: false

Dönüşler

Kod Örnekleri

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

Bir SharedTable 'nin donmuş (sadece okuma) bir kopyasını oluşturur ve kopyayı geri verir.Bu işlevin davranışı, klonun dondurulması dışında klonun davranışıyla aynıdır.

Derin bir klon istenirse, klonlanmış SharedTable nesnelerin tümü dondurulur.

Parametreler

Klonlanacak Paylaşılan Masa nesnesi.

deep: boolean

Derin bir klon oluşturmak ( true ) veya yüzeysel bir klon oluşturmak ( false ).

Varsayılan değer: false

Dönüşler

increment

Bir elemanın değerini atomik olarak artırır.Belirtilen anahtarla bir eleman SharedTable 'de bulunmalı ve number türünde olmalıdır.Belirtilen delta değeri değere eklenir ve orijinal değer geri verilir.

Bu amaçla fonksiyonu da kullanılabilir; bu fonksiyonu konfor ve performans için mevcuttur (genel olarak, daha hızlıdır, bu yüzden mümkün olduğunda tercih edilmelidir).Aşağıdaki iki işlev çağrısı aynı etkiye sahiptir:


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)

Eğer SharedTable dondurulursa, operasyon başarısız olur ve bir hata yükseltilir.

Parametreler

Güncellenmesi gereken SharedTable nesne.

key: string | number

Güncellenmesi gereken SharedTable nesnenin elemanının anahtarı.

delta: number

SharedTable 'deki elemana eklenmesi gereken değer.

Dönüşler

Öğenin orijinal değeri, delta eklenmeden önce.

Kod Örnekleri

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

Geri döndürür true eğer SharedTable dondurulursa (sadece okuma).


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

Parametreler

Donmuş durumu sorgulanacak olan SharedTable nesne.

Dönüşler

size

Paylaşılan Masada depolanan öğe sayısını döndürür.Diğer kodlar aynı anda Paylaşılan Masayı değiştiriyorsa, geri döndürülen boyut artık doğru olmayabilir, çünkü diğer kodlar Paylaşılan Masadan elemanlar ekleyebilir veya kaldırabilir.


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

Parametreler

Boyutu sorgulanacak olan SharedTable nesne.

Dönüşler

update

()

Bir elemanın değerini atomik olarak günceller.

Farklı yürütme senaryolarında çalışan SharedTable kodlara aynı anda erişildiğinde, erişimlerin öngörülemez bir şekilde karışması mümkündür.Bu nedenle, aşağıdaki gibi kod genellikle yanlıştır, çünkü değer ilk satırda okunurken ve ikinci satırda güncellenirken değişmiş olabilir:


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

Güncelleme işlevi, bir elemana atomik bir güncelleme yapmak mümkün kılar.Elemanın mevcut değeri ile çağıracağı bir işlev gerektirir.Daha sonra işlev yeni değeri hesaplayabilir ve geri döndürebilir.İşlevin aynı anda diğer kodlardan değiştirildiğinde SharedTable çok kez çağrılabileceğini unutmayın.

Eğer SharedTable dondurulursa, operasyon başarısız olur ve bir hata yükseltilir.

Parametreler

Güncellenmesi gereken SharedTable nesne.

key: string | number

Güncellenmesi gereken SharedTable nesnenin elemanının anahtarı.

Eleman için yeni değeri hesaplamak için çağrılacak işlev.

Dönüşler

()

Kod Örnekleri

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