coroutine
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
coroutine ใช้เพื่อประสานงานหลายอันในเวลาเดียวกันจากภายในสคริปเดียวกัน เช่น การผลิตค่าจากการป้อนข้อมูล หรือการปฏิบัติงานบนสายพานในขณะที่แ
การใช้งาน Coroutines
สามารถสร้างคู่มือใหม่โดยการให้ฟังชันให้กับ coroutine.create() เมื่
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() เพื่อตรวจสอบสถานะของมัน:
<tbody><tr><td><b>รอดชีวิต</b></td> <td>คอรูตินกำลังรอที่จะเริ่มต้นขึ้นอีก คอรูตินเริ่มในสถานะนี้และเข้าสู่มันเมื่อฟังก์ชันของพวกเขาเรียก <code>coroutine.yield()</code></td></tr><tr><td><b>วิ่ง</b></td><td>coroutine กำลังทำงานในขณะนี้</td></tr><tr><td><b>ปกติ</b></td> <td>coroutine กำลังรอผลการทำงานของ coroutine อื่น; ในคำอื่น, มันได้เริ่ม coroutine อื่น.</td></tr><tr><td><b>ตาย</b></td> <td>ฟังก์ชันถูกหยุด (กลับมาหรือโยนข้อผิดพลาด) ไม่สามารถใช้รูปแบบ coroutine ต่อไปได้</td></tr></tbody>
สถานะ | หมายถึง |
---|
การหุ้ม Coroutines
เมื่อทำงานกับ coroutines คุณยังสามารถละทิ้งการใช้งานของ coroutine และใช้งานรูปแบบของตัวอุปกรณ์เท่านั้น เช่นรูปแบบของตัวอุปกรณ์จะดำเนินการต่อเมื่อเรียกและจะกลับมาเท่านั้นสิ่งที่น
-- สร้าง coroutine และกลับรุ่นตัวอักษรที่รวมมันlocal f = coroutine.wrap(task)-- รวมคอรูตูนเหมือนว่าเราเรียกคอรูตูน.resume()local result = f()-- หากเกิดข้อผิดพลาดมันจะถูกเรียกขึ้นที่นี่!-- This differs from coroutine.resume() which acts similar to pcall()
ค่าแรกที่กลับมาจาก coroutine.resume() อธิบายว่าว่าคู่มือจะทำงานโดยไม่มีข้อผิดพลาดหรือไม่ อย่างไรก็ตาม ฟังก์ชันที่กลับมาโดย
ตัวอย่างรูปแบบผู้ผลิต
จินตนาการภารกิจที่ผลิตซ้ำของคำ: แต่ละครั้งที่ผลิตซ้ำจะผลิตอีกครั้ง ตัวอย่างเช่นการให้ Hello จะผลิต Hello ต่อไป, HelloHello</
-- ฟังก์ชันนี้ทำซ้ำคำทุกครั้งที่คู่มือการประมวลผลของมันจะเริ่มขึ้นอีก
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)) -- ใช่, สวัสดีprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
สำหรับผลิตภัณฑ์นี้คุณยังสามารถใช้ coroutine.wrap() เพื่อรับฟังก์ชันที่ผลิตมูลค่า:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- สวัสดีprint(f()) -- สวัสดีprint(f()) -- HelloHelloHello