SharedTable

แสดงที่เลิกใช้งานแล้ว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เป็นโครงสร้างข้อมูลที่คล้ายกับตารางที่สามารถแชร์ได้ในบริบทของการประมวลผล โดยสามารถใช้สำหรับหลากหลายของข้อมูลทั่วไป สามารถใช้ได้เฉพาะกับ Parallel Luau ซึ่งสาม

มีวิธีการสื่อสารแบบแสดงผลระหว่างสคริปต์อยู่สองสามวิธี วิธีหนึ่งคือการเก็บและดึง SharedTable

เหมือนโต๊ะ Luau วัตถุ SharedTable เก็บชุดของคู่สมาชิกของค่าตัวละคร ในขณะที่วัตถุ Luau จะเก็บได้เฉพาะชนิดของวัตถุที่คุณเลือกเท่านั้น โดยทั่วไป SharedTables จะเก็บได้เฉพาะชุดของ

ต้องเป็น (1) ตัวอักษรหรือ (2) ตัวเลขอย่างน้อย 2 32 หรือไม่มีประเภทอื่นของตัวอักษร

ค่าต้องมีหนึ่งในรูปแบบต่อไปนี้: บู๊ค, หมายเลข, เวกเตอร์, สตริง, SharedTable หรือประเภท

SharedTable ตัวอย่างเป็นวัตถุที่แตกต่างกัน SharedTable ตัวอย่างไม่เคยเทียบเท่ากัน แม้ว่าพวกเขาจะมีเนื้อหาที่จะเทียบเท่ากัน

เหมือนโต๊ะ Luau ตัววัตถุ SharedTable อาจถูกแช่แข็งในกรณีนี้จะอ่านเท่านั้น การพยา

ตัวอย่างโค้ด

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

สรุป

คอนสตรัคเตอร์

  • new()

    กลับไปที่ SharedTable ใหม่

  • new(t : table)

    กลับมาใหม่ที่ SharedTable ที่มีรูปแบบที่เทียบเท่ากับรูปแบบที่ให้ในตาราง Luau ที่ให้

ฟังก์ชัน

คอนสตรัคเตอร์

new

กลับไปที่ SharedTable ใหม่


local st = SharedTable.new()

new

กลับมาใหม่ที่ SharedTable ที่มีรูปแบบที่เทียบเท่ากับรูปแบบที่ให้ในตาราง Luau ที่ให้

หากตาราง Luau ที่ให้มีคี่หรือมูลใด ๆ ที่ไม่สามารถเก็บได้ใน SharedTable การสร้างของ 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")

หมายเหตุว่าในบางกรณีอาจเป็นไปได้ที่จะเก็บ SharedTable ใน SharedTableRegistry วิธี Class.ShareTableRegistry:GetSharedTable() ให้วิธีที่สะดวกในการทำสิ่งนี้

พารามิเตอร์

ตาราง Luau ซึ่งองค์ประกอบจะถูกเก็บไว้ใน SharedTable ใหม่

ฟังก์ชัน

clear

void

ลบองค์ประกอบทั้งหมดออกจาก SharedTable

หาก SharedTable ถูกแช่แข็ง การดำเนินการจะล้มเหลวและมีข้อผิดพลาดที่จะเกิดขึ้น


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

พารามิเตอร์

The SharedTable ล้างข้อมูล.

ส่งค่ากลับ

void

สร้างคลอนของ SharedTable และส่งคลอนกลับมา

หากตัวอย่างอิสระ deep ไม่ปรากฏหรือหากมันปรากฏแ

การเลียนแบบที่เื้อบางเป็นอะตอมดังนั้นการเลียนแบบ SharedTable จะประกอบด้วยภาพถ่ายที่เหมือนกันของสถานะในต้นฉบับ SharedTable แม้ว่าจะเปลี่ยนแปลงได้จากสคริปต์อื่น

หากตัวอย่างอาวุธ deep ที่มีมูลค่า true จะสร้างไดอะไหมเป็นคลอนลึก ไดอะไหมเป็นคลอนลึกจะเรียกคืนสถานะของ SharedTable โดยที่ไม่มีสถ

การเคลือนของแต่ละ SharedTable ภายในกราฟิกของ SharedTable อาจเป็นอะตอม แต่ส่ว

วัตถุ SharedTable ที่ถูกเคลือนวางอาจถูกแช่แข็ง (เฉพาะการอ่าน) หรือไม่ ไม่ว่ากัน วัตถุเคลือนที่ถูกสร้างขึ้นใหม่จะเป็น ไม่ เคลือน (และจึงสา

เพื่อแสดงความแตกต่างระหว่างลอกลึกและลอกตื้น โปรดพิจารณาตัวอย่างต่อไปนี้ ตัวอย่างแรกสร้างลอกลึกและตัวอย่างที่สองสร้างลอกตื้น

พารามิเตอร์

วัตถุ SharedTable ที่จะโคลน

deep: bool

จะสร้างคลอนลึก ( true หรือคลอน superficial ( false )

ค่าเริ่มต้น: false

ส่งค่ากลับ

ตัวอย่างโค้ด

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

สร้างคลอนที่แช่แข็ง (อ่านเท่านั้น) ของ SharedTable และส่งคลอนกลับไป พฤติกรรมของฟังก์ชันนี้เหมือนกับพฤติกรรมของคลอนยกเว้นว่าคลอนถูกแช่แข็ง

หากต้องการคลอนลึก ทั้งหมดของวัตถุ SharedTable ที่คลอนจะถูกแช่แข็ง

พารามิเตอร์

ตัวแทน SharedTable เพื่อโคลน

deep: bool

จะสร้างคลอนลึก ( true หรือคลอน superficial ( false )

ค่าเริ่มต้น: false

ส่งค่ากลับ

increment

เพิ่มมูลค่าขององค์ประกอบโดยอัตโนมัติ องค์ประกอบที่มีคีย์ที่ระบุต้องมีอยู่ใน SharedTable และมีขนาด number องค์ประกอบที่ระบุไว้จะถูกเพิ่มเข้ามาในมูลค่า แล

การใช้งาน SharedTable.update นี้ยังสามารถใช้สำหรับวัตถุประสงค์นี้ได้; ฟังก์ชันนี้ increment มีอยู่เพื่อความสะดวกและประสิทธิภาพ (ในทั่วไป, increment


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)

หาก SharedTable ถูกแช่แข็ง การดำเนินการจะล้มเหลวและมีข้อผิดพลาดที่จะเกิดขึ้น

พารามิเตอร์

วัตถุ SharedTable ที่จะปรับปรุง

key: string | number

กุญแจขององค์ประกอบใน SharedTable เพื่อปรับปรุง

delta: number

มูลค่าที่จะถูกเพิ่มให้กับองค์ประกอบใน SharedTable

ส่งค่ากลับ

ค่าเริ่มต้นขององค์ประกอบก่อนที่จะเพิ่ม delta ไปยังมัน

ตัวอย่างโค้ด

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

กลับ true หาก SharedTable ถูกแช่แข็ง (อ่านเท่านั้น)


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

พารามิเตอร์

Datatype.SharedTable รุ่นที่แช่แข็งที่จะต้องขอ

ส่งค่ากลับ

size

กลับจำนวนรายการที่เก็บไว้ใน SharedTable หมายเหตุว่าหากสคริปต์อื่นๆ กำลังเปลี่ยนแปลง SharedTable ในขณะนี้ ขนาดที่กลับมาอาจไม่ถูกต้องหลังจากที่มันถูกกลับมาเนื่องจากสคริปต์อื่นๆ อาจมีรายการที่


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

พารามิเตอร์

Datatype.SharedTable รุ่นที่มีขนาดเป็นไปยังเครื่องของคุณ

ส่งค่ากลับ

update

void

อัปเดตค่าขององค์ประกอบโดยอนุภาค

เมื่อ SharedTable ถูกเข้าถึงโดยสคริปต์ที่วิ่งในสภาพประมาณการที่แตกต่างกัน, มีความเป็นไปได้ที่การเข้าถึงของพวกเขาจะสลับซับซ้อนได้ เนื่องจากเหตุนี้, โค้ดเ


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

ระบบอัปเดตทำให้เป็นไปได้ที่จะทำอัปเดตอะตอมสำหรับองค์ประกอบ มันใช้ตัวฟังที่จะโทรกับค่าปัจจุบันขององค์ประกอบ ตัวฟังสามารถคํานวณและกลับค่าใหม่ได้ หาก

หาก SharedTable ถูกแช่แข็ง การดำเนินการจะล้มเหลวและมีข้อผิดพลาดที่จะเกิดขึ้น

พารามิเตอร์

วัตถุ SharedTable ที่จะปรับปรุง

key: string | number

กุญแจขององค์ประกอบใน SharedTable เพื่อปรับปรุง

คุณสมบัติที่จะถูกเรียกเพื่อคํานวณค่าใหม่สําหรับองค์ประกอบ

ส่งค่ากลับ

void

ตัวอย่างโค้ด

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