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)) -- จริง, HelloHello
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

สำหรับฟังก์ชันผู้ผลิตนี้คุณสามารถใช้ coroutine.wrap() เพื่อรับฟังก์ชันที่ผลิตค่าได้:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- สวัสดี
print(f()) -- สวัสดีสวัสดี
print(f()) -- HelloHelloHello

สรุป

ฟังก์ชัน

  • close(co : coroutine):boolean,Variant<string, ()>

    ปิดและวางคอรูตินที่ให้ไว้ในสถานะตาย

  • สร้าง coroutine ใหม่พร้อมกับร่างกาย f f ต้องเป็นฟังก์ชัน Luau

  • ส่งคืน true หากคอรูตินฟังก์ชันนี้ถูกเรียกภายในสามารถให้ผลได้อย่างปลอดภัย

  • resume(co : coroutine,... : Variant):boolean,Variant<Tuple, string>

    เริ่มหรือดำเนินการต่อการดําเนินการของ coroutine co

  • คืน coroutine ที่กำลังดำเนินอยู่

  • ส่งสถานะของ coroutine co สตริง

  • สร้างคอรูตินใหม่และส่งคืนฟังก์ชันที่เมื่อเรียกใช้จะระงับคอรูติน

  • yield(... : Tuple):Tuple<Variant>

    ระงับการดำเนินการของ coroutine

ฟังก์ชัน

close

ปิดและวางคอรูตินที่ให้ไว้ในสถานะตายฟังก์ชันนี้คืน true ยกเว้นในกรณีที่คอรูตินอยู่ในสถานะข้อผิดพลาดซึ่งในกรณีนั้นจะคืน false และข้อความข้อผิดพลาดไม่สามารถปิดการทำงานของคอรูตินที่กําลังดําเนินอยู่ได้คอรอลีนไม่สามารถดำเนินการต่อได้หลังจากถูกปิด

พารามิเตอร์

ส่งค่ากลับ

true เว้นแต่คอรูตินที่ปิดอยู่อยู่ในสถานะข้อผิดพลาด

Variant<string, ()>

ข้อความข้อผิดพลาด ถ้ามี

create

สร้าง coroutine ใหม่พร้อมกับร่างกาย f f ต้องเป็นฟังก์ชัน Luau

พารามิเตอร์

ส่งค่ากลับ

isyieldable

ส่งคืน true หากคอรูตินฟังก์ชันนี้ถูกเรียกภายในสามารถให้ผลได้อย่างปลอดภัยการยอมแพ้คอรูตินภายใน metamethods หรือฟังก์ชัน C ถูกห้ามไว้ ยกเว้น pcall และ xpcall

ส่งค่ากลับ

ว่า coroutine สามารถให้ผลอย่างปลอดภัยได้หรือไม่ในจุดนี้

resume

เริ่มหรือดำเนินการต่อการดําเนินการของ coroutine coครั้งแรกที่คุณดำเนินการต่อคอรูติน มันจะเริ่มต้นดำเนินการต่อร่างกายค่า ... ถูกส่งเป็นอาร์กิวเมนต์ให้กับฟังก์ชันร่างกายหาก coroutine ได้ผลิตแล้ว ให้ดำเนินการรีสตาร์ทใหม่; ค่า ... จะถูกส่งเป็นผลลัพธ์จากการผลิตหากคอรูตินทำงานโดยไม่มีข้อผิดพลาดใดๆ ให้ดำเนินการต่อด้วยการส่งคืนค่าจริงบวกกับค่าใดๆ ที่ส่งไปเพื่อให้ได้ (หากคอรูตินให้ผลผลิต) หรือค่าใดๆ ที่ส่งโดยฟังก์ชันร่างกาย (หากคอรูตินสิ้นสุด)หากมีข้อผิดพลาดใดๆ ให้ดำเนินการต่อการคืนค่าเป็นลบบวกกับข้อความข้อผิดพลาด

พารามิเตอร์

...: Variant

ส่งค่ากลับ

running

คืน coroutine ที่กำลังดำเนินอยู่

ส่งค่ากลับ

status

ส่งสถานะของ coroutine co ในฐานะข้อความ: 'กําลังดําเนินการ' หาก coroutine กําลังดําเนินการ (นั่นคือมันเรียกสถานะ); 'ระงับ' หาก coroutine ถูกระงับในการเรียกเพื่อให้ได้ผลผลิต หรือหากยังไม่เริ่มต้นดําเนินการแล้ว; 'ปกติ' หาก coroutine ใช้งานอยู่ แต่ยังไม่ได้เริ่มต้นดําเนินการ (นั่นคือมันได้เริ่มต้นอีก coroutine แล้ว); และ 'ตาย' หาก coroutine ได้สิ้นสุดฟังก์ชันร่างกายแล้ว หรือหากมันไม่ได้เริ่มต้นดําเนินการแล้ว

พารามิเตอร์

ส่งค่ากลับ

สร้าง coroutine ใหม่พร้อมกับร่างกาย ff ต้องเป็นฟังก์ชัน Luauคืนฟังก์ชันที่ระงับการโทรคอรูตินทุกครั้งที่เรียกอาร์กิวเมนต์ใดๆ ที่ส่งไปยังฟังก์ชันจะทำหน้าที่เป็นอาร์กิวเมนต์เสริมเพื่อดำเนินการต่อส่งค่าเดียวกันที่ส่งกลับโดยการดำเนินการต่อยกเว้นโบลีนแรกในกรณีของข้อผิดพลาดจะแพร่กระจายข้อผิดพลาด

พารามิเตอร์

ส่งค่ากลับ

yield

Tuple<Variant>

ระงับการดำเนินการของคอรูตินที่เรียกอาร์กิวเมนต์ใดๆ ที่จะให้ผลผลิตจะถูกส่งเป็นผลลัพธ์เพิ่มเติมเพื่อดำเนินการต่อการยอมแพ้คอรูตินภายใน metamethods หรือฟังก์ชัน C ถูกห้ามไว้ ยกเว้น pcall และ xpcall

พารามิเตอร์

...: Tuple

ส่งค่ากลับ

Tuple<Variant>