coroutine

顯示已棄用項目

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

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)) -- 您好,HelloHello
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>