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

สรุป

ฟังก์ชัน

ฟังก์ชัน

close

พารามิเตอร์

ส่งค่ากลับ

Variant<string, void>

create

พารามิเตอร์

ส่งค่ากลับ

isyieldable

ส่งค่ากลับ

resume

พารามิเตอร์

...: Variant

ส่งค่ากลับ

Variant<Tuple, string>

running

ส่งค่ากลับ

status

พารามิเตอร์

ส่งค่ากลับ

พารามิเตอร์

ส่งค่ากลับ

yield

Tuple<Variant>

พารามิเตอร์

...: Tuple

ส่งค่ากลับ

Tuple<Variant>