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

關閉並將提供的 coroutine 設為死狀態。這個功能會返回 true ,除非 coroutine 位於錯誤狀態,在此情況下它會返回 false 和錯誤訊息。當前運行中的 coroutine 無法被關閉。當 coroutine 關閉後,無法恢復錯誤訊息。

參數

返回

true 除非關閉 coroutine 是在錯誤狀態。

Variant<string, void>

如有錯誤訊息。

create

創建一個新的程式碼,body f 必須是 Lua 函數。

參數

返回

isyieldable

true 如果 coroutine 此功能在內部可以安全輸出。 在 metamethods 或 C 函數中呼叫 coroutine 是禁止的,除了 pcallxpcall 之外。

返回

較論程式碼是否能在此時安全輸出。

resume

開始或繼續執行 coroutine co 。第一次你重新啟動 coroutine 時,它會開始執行其身體。值 ... 作為 coroutine 的參數傳給身體功訊息。如果 coroutine

參數

...: Variant

返回

Variant<Tuple, string>

running

返回正在執行的程式碼。

返回

status

返回 coroutine 的狀態,作為字串: '執行',如果 coroutine 正在執行 ( 即,它稱為狀態); '暫停',如果 coroutine 暫停在呼叫中產生,或者還沒有開始執行; '正常' 如果 coroutine 已啟用,但還沒有開始執行; 或 '死亡' 如果 coroutine 已經停止運行。

參數

返回

創建新的程式碼,程式碼 f 必須是 Lua 函數。 返回一個會在每次呼叫程式碼時重新執行程序的程式碼。 傳回傳回程式碼的所有參數,除了第一個Boolean。 如果發生錯誤,則傳回錯誤。

參數

返回

yield

Tuple<Variant>

暫停執行呼叫程式碼的執行。 所有與生成有關的參數都傳送為額外結果來重新啟動。 在 metamethode 或 C 函數內生成程式碼的程式碼都禁止,只有 pcallxpcall

參數

...: Tuple

返回

Tuple<Variant>