coroutine 是用於在同一個 script 中同時執行多個任務的。這些任務可能包括從輸入中產生值或解釋工作時的工作。一個任務甚至不需要有定義的結束點,但它需要定義特定時間來讓其他事項可以執行。
使用程式碼
提供 funct建立、創作on 到 coroutine.create() 即可創建新的 coroutine 。一旦創建,coroutine 不會開始執行,直到第一個呼訊息
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>虛擬程式正在執行。</td></tr><tr><td><b>普通</b></td> <td>coroutine 正在等待另一個 coroutine 的輸出;也就是說,它已重新啟動另一個 coroutine。</td></tr><tr><td><b>死亡</b></td> <td>函數已停止 (發生錯誤或返回)。不能再使用 coroutine 了。</td></tr></tbody>
狀態 | 意義 |
---|
包裝程序
當與導讀程式碼工作時,您也可以為時程碼對象放棄使用 coroutine 對象,而代為使用 wrap 函數。此類 wrap 函數會在特定 coroutine 呼叫時重新採集,並且只會返回已經提取的值。您可以使用 coroutine.wrap() 來執行此操作:
-- 創建程序碼,並且返回一個包含程序碼的返回函數local f = coroutine.wrap(task)-- 將 coroutine 視為我們的 coroutine.resume()local result = f()-- 如果發生錯誤,它會被提升在這裡!-- This differs from coroutine.resume() which acts similar to pcall()
第一個值從 coroutine.resume() 描述是否發生錯誤。 但是由 coroutine.wrap() 返回的函數將不會這樣做:它們直接返回已返回或傳送的值。 如果發生錯誤,則會在 coroutine.yield() 上直接返回。 如果發生錯誤,則
生產者模式範例
想像一個產生重複字詞的任務:每次產生重複時,下一個會產生一個更多。例如提供 Hello 會產生 Hello , HelloHello , 2>HelloHello2> 等等,等等。若要這麼做,您可以定義 5>peatThis5> :
-- 此功能會每次重新啟動程式程序時重複一個字
local function repeatThis(word)
local repetition = ""
while true do
-- 重複一次,然後輸出結果
repetition = repetition .. word
coroutine.yield(repetition)
end
end
要作為程式碼執行此功能,您可以使用 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