coroutine
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
คอรูติน ถูกใช้เพื่อดําเนินการภารกิจหลายอย่างพร้อมกันในเวลาเดียวกันจากสคริปต์เดียวกันภารกิจดังกล่าวอาจรวมถึงการผลิตค่าจากอินพุตหรือทำงานบนสับรูติเมื่อแก้ปัญหาที่ใหญ่กว่างานไม่จำเป็นต้องมีจุดสิ้นสุดที่กำหนดไว้ แต่ต้องกำหนดเวลาเฉพาะที่จะให้หยุด (หยุดชะงัก) เพื่อให้สิ่งอื่นๆ สามารถทำงานได้
ใช้ Coroutines
สามารถสร้าง coroutine ใหม่ได้โดยการให้ฟังก์ชันแก่ coroutine.create()เมื่อสร้างแล้ว coroutine จะไม่เริ่มทำงานจนกว่าจะมีการโทรครั้งแรกไปที่ coroutine.resume() ซึ่งส่งอาร์กิวเมนต์ไปยังฟังก์ชันการโทรนี้จะกลับเมื่อฟังก์ชันหยุดหรือเรียก coroutine.yield() และเมื่อเกิดเหตุนี้ขึ้น coroutine.resume() จะคืนค่าที่กลับโดยฟังก์ชัน หรือค่าที่ส่งไปยัง coroutine.yield() หรือข้อความข้อผิดพลาดหากเกิดข้อผิดพลาด ค่าการ返回ที่สองคือข้อผิดพลาดที่โยน
local function task(...)
-- ฟังก์ชันนี้อาจทำงานบางอย่างสักครู่แล้วแสดงค่าบางอย่าง
coroutine.yield("first") -- จะถูกส่งคืนโดย coroutine.resume()
-- ฟังก์ชันจะดำเนินต่อไปเมื่อถูกระงับอีกครั้ง
return "second"
end
local taskCoro = coroutine.create(task)
-- เรียกการดำเนินการต่อเมื่อครั้งแรกซึ่งทำงานตั้งแต่ต้น
local success, result = coroutine.resume(taskCoro, ...)
print(success, result) --> จริงก่อน (ภารกิจที่เรียกว่า coroutine.yield()}
-- ดำเนินการใช้ฟังก์ชันต่อไปจนกว่าจะให้ผลหรือหยุด
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")
ในระหว่างชีวิตของ coroutine คุณสามารถโทร coroutine.status() เพื่อตรวจสอบสถานะของมัน:
<th>ความหมาย</th></tr></thead><tbody><tr><td><b>ระงับ</b></td><td>คอรูตินกำลังรอการดำเนินการต่อ คอรูตินเริ่มในสถานะนี้และเข้าสู่สถานะนี้เมื่อฟังก์ชันของพวกเขาเรียก <code>coroutine.yield()</code></td></tr><tr><td><b>กำลังดำเนินการ</b></td><td>คอรูตินกำลังดำเนินการอยู่ในขณะนี้</td></tr><tr><td><b>ปกติ</b></td><td>คอรูตินกำลังรอผลผลิตของคอรูตินอื่น; คือกล่าวอีกนัยหนึ่งมันได้เริ่มคอรูตินอื่นอีกครั้ง</td></tr><tr><td><b>ตาย</b></td><td>ฟังก์ชันถูกหยุด (กลับหรือโยนข้อผิดพลาด) คอรูตินไม่สามารถใช้ต่อได้</td></tr></tbody>
สถานะ |
---|
การห่อคอรูติน
เมื่อทำงานกับ coroutine คุณยังสามารถข้ามการใช้วัตถุ coroutine และใช้ฟังก์ชัน wrapper แทนฟังก์ชัน wrapper ดังกล่าวจะดำเนินการต่อคอรูตินที่เฉพาะเจาะจงเมื่อเรียกและจะส่งคืนเฉพาะค่าที่ได้รับเท่านั้นคุณสามารถทำเช่นนี้โดยใช้ coroutine.wrap() :
-- สร้าง coroutine และส่งคืนฟังก์ชันห่อที่ระงับมันlocal f = coroutine.wrap(task)-- ดำเนินการต่อคอรูตินต่อไปเหมือนว่าเราเรียก coroutine.resume()local result = f()-- หากเกิดข้อผิดพลาดจะถูกยกขึ้นที่นี่!-- This differs from coroutine.resume() which acts similar to pcall()
ค่าแรกที่ส่งกลับจาก coroutine.resume() อธิบายว่าคอรูตินทำงานโดยไม่มีข้อผิดพลาดหรือไม่อย่างไรก็ตาม ฟังก์ชันที่ส่งคืนโดย coroutine.wrap() จะไม่ทำเช่นนี้: แทนที่จะส่งค่ากลับโดยตรงหรือส่งไปยัง coroutine.yield() หากมีหากเกิดข้อผิดพลาดขณะทำงานฟังก์ชัน coroutine ข้อผิดพลาดจะถูกยกขึ้นในการโทรของฟังก์ชันที่ส่งคืน
ตัวอย่างลายผลิตภัณฑ์
จินตนาการถึงงานที่ผลิตการทำซ้ำของคํา: ทุกครั้งที่ผลิตการทำซ้ำครั้งต่อไปจะผลิตอีกหนึ่งตัวอย่างเช่นการให้ Hello จะผลิต Hello , HelloHello , HelloHelloHello ฯลฯเพื่อทําเช่นนี้คุณสามารถกําหนด repeatThis() :
-- ฟังก์ชันนี้ทำซ้ำคําทุกครั้งที่คอรูตินถูกระงับใหม่
local function repeatThis(word)
local repetition = ""
while true do
-- ผลการค้นหา
repetition = repetition .. word
coroutine.yield(repetition)
end
end
เพื่อรันฟังก์ชันนี้เป็น coroutine คุณสามารถใช้ coroutine.create() ตามด้วยการโทรหลายครั้งไปที่ coroutine.resume() :
local repetitionCoro = coroutine.create(repeatThis)print(coroutine.resume(repetitionCoro, "Hello")) -- จริง, สวัสดีprint(coroutine.resume(repetitionCoro)) -- จริง, HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
สำหรับฟังก์ชันผู้ผลิตนี้คุณสามารถใช้ coroutine.wrap() เพื่อรับฟังก์ชันที่ผลิตค่าได้:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- สวัสดีprint(f()) -- สวัสดีสวัสดีprint(f()) -- HelloHelloHello
สรุป
ฟังก์ชัน
ปิดและวางคอรูตินที่ให้ไว้ในสถานะตาย
สร้าง coroutine ใหม่พร้อมกับร่างกาย f f ต้องเป็นฟังก์ชัน Luau
ส่งคืน true หากคอรูตินฟังก์ชันนี้ถูกเรียกภายในสามารถให้ผลได้อย่างปลอดภัย
เริ่มหรือดำเนินการต่อการดําเนินการของ coroutine co
คืน coroutine ที่กำลังดำเนินอยู่
ส่งสถานะของ coroutine co สตริง
สร้างคอรูตินใหม่และส่งคืนฟังก์ชันที่เมื่อเรียกใช้จะระงับคอรูติน
ระงับการดำเนินการของ coroutine
ฟังก์ชัน
close
ปิดและวางคอรูตินที่ให้ไว้ในสถานะตายฟังก์ชันนี้คืน true ยกเว้นในกรณีที่คอรูตินอยู่ในสถานะข้อผิดพลาดซึ่งในกรณีนั้นจะคืน false และข้อความข้อผิดพลาดไม่สามารถปิดการทำงานของคอรูตินที่กําลังดําเนินอยู่ได้คอรอลีนไม่สามารถดำเนินการต่อได้หลังจากถูกปิด
พารามิเตอร์
resume
เริ่มหรือดำเนินการต่อการดําเนินการของ coroutine coครั้งแรกที่คุณดำเนินการต่อคอรูติน มันจะเริ่มต้นดำเนินการต่อร่างกายค่า ... ถูกส่งเป็นอาร์กิวเมนต์ให้กับฟังก์ชันร่างกายหาก coroutine ได้ผลิตแล้ว ให้ดำเนินการรีสตาร์ทใหม่; ค่า ... จะถูกส่งเป็นผลลัพธ์จากการผลิตหากคอรูตินทำงานโดยไม่มีข้อผิดพลาดใดๆ ให้ดำเนินการต่อด้วยการส่งคืนค่าจริงบวกกับค่าใดๆ ที่ส่งไปเพื่อให้ได้ (หากคอรูตินให้ผลผลิต) หรือค่าใดๆ ที่ส่งโดยฟังก์ชันร่างกาย (หากคอรูตินสิ้นสุด)หากมีข้อผิดพลาดใดๆ ให้ดำเนินการต่อการคืนค่าเป็นลบบวกกับข้อความข้อผิดพลาด
พารามิเตอร์
status
ส่งสถานะของ coroutine co ในฐานะข้อความ: 'กําลังดําเนินการ' หาก coroutine กําลังดําเนินการ (นั่นคือมันเรียกสถานะ); 'ระงับ' หาก coroutine ถูกระงับในการเรียกเพื่อให้ได้ผลผลิต หรือหากยังไม่เริ่มต้นดําเนินการแล้ว; 'ปกติ' หาก coroutine ใช้งานอยู่ แต่ยังไม่ได้เริ่มต้นดําเนินการ (นั่นคือมันได้เริ่มต้นอีก coroutine แล้ว); และ 'ตาย' หาก coroutine ได้สิ้นสุดฟังก์ชันร่างกายแล้ว หรือหากมันไม่ได้เริ่มต้นดําเนินการแล้ว
พารามิเตอร์
ส่งค่ากลับ
wrap
สร้าง coroutine ใหม่พร้อมกับร่างกาย ff ต้องเป็นฟังก์ชัน Luauคืนฟังก์ชันที่ระงับการโทรคอรูตินทุกครั้งที่เรียกอาร์กิวเมนต์ใดๆ ที่ส่งไปยังฟังก์ชันจะทำหน้าที่เป็นอาร์กิวเมนต์เสริมเพื่อดำเนินการต่อส่งค่าเดียวกันที่ส่งกลับโดยการดำเนินการต่อยกเว้นโบลีนแรกในกรณีของข้อผิดพลาดจะแพร่กระจายข้อผิดพลาด