coroutine

顯示已棄用項目

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

一個 競爭線程 用於在同一個腳指令碼內同時執行多個任務。這些任務可能包括從輸入產生值或在解決較大問題時執行子程序的工作。任務甚至不需要有定義的結束點,但它需要定義特定時間,在那裡它 產生 (暫停)讓其他事情被處理。

使用回合線程

新的核心子程序可以通過提供函數給 coroutine.create() 來創建。一旦創建,回合線程不會在第一次呼叫 coroutine.resume() 傳遞參數給函數之前開始運行。當函數停止或呼叫 coroutine.yield() 時,此呼叫會返回;當這發生時,coroutine.resume() 會返回函數所返回的值、傳送到 coroutine.yield() 的值或錯誤訊息。如果發生錯誤,第二個返回值是投擲的錯誤。


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() 來檢查其狀態:


<th>意義</th>
</tr>
</thead>
<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>腳本正在等待另一個腳本的產出;換言之,它已經重新啟動了另一個腳本。</td>
</tr>
<tr>
<td><b>死亡</b></td>
<td>功能已停止(返回或投擲錯誤)。此後無法使用並行運作。</td>
</tr>
</tbody>
狀態

包裝回合順序

當使用腳本時,您也可以放棄使用腳本對象,而使用包裝函數。這樣的包裝函數會在呼叫時恢復特定的並行作業,並只會返回已獲得的值。您可以使用 coroutine.wrap() 來執行此操作:


-- 創建任務並返回將它重新啟動的包裝函數
local f = coroutine.wrap(task)
-- 如果我們呼叫 coroutine.resume() 一樣,繼續呼叫 coroutine
local result = f()
-- 如果發生錯誤,將在此處提出!
-- This differs from coroutine.resume() which acts similar to pcall()

coroutine.resume() 返回的第一個值描述是否有錯誤發生的 coroutine 運行。然而,由 coroutine.wrap() 返回的功能不會這麼做:相反,它們會直接返回傳回或傳給 coroutine.yield() 的值,如果有。如果在執行核心功能時發生錯誤,錯誤將在返回的函數的呼叫上提出。

生產者模式範例

想像一個任務,會產生一個單詞的重複:每次產生重複,下一個任務將產生一個更多。例如,提供 Hello 將產生 Hello , HelloHello , HelloHelloHello 等。要執行此操作,您可以定義 repeatThis() :


-- 此功能每次其並行線程被重新啟動時重複一個字詞
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

關閉並將提供的子程序置於死狀態。此功能會返回 true 除非腳本處於錯誤狀態,否則會返回 false 和錯誤訊息。目前運行中的腳本無法關閉。一個 coroutine 無法在關閉後重新啟動。

參數

返回

true 除非關閉的核心子程序處於錯誤狀態。

Variant<string, ()>

如果有錯誤訊息,則為其訊息。

create

創建一個新的 coroutine,其體必須是 Luau 函數。

參數

返回

isyieldable

返回 true 如果在可安全生產的情況下呼叫此函數的子程序,它將返回。在 metamethods 或 C 函數內放棄 coroutine 是禁止的,除了 pcallxpcall 之外。

返回

是否在此時點安全地可以將核心出來。

resume

開始或繼續執行 coroutine co 。第一次您恢復一個並行任務時,它開始運行其體。值 ... 被傳送到身體功能作為參數。如果coroutine已經產生了,請重新啟動它;值 ... 被傳遞為從產生中獲得的結果。如果核心運行無任何錯誤,則恢復返回真值加任何傳給產生的值(如果核心產生)或身體功能返回的任何值(如果核心結束)。如果發生任何錯誤,將返回假以及錯誤訊息。

參數

...: Variant

返回

running

返回運行中的子程序。

返回

status

返回 coroutine 的狀態,作為字串:「運行」,如果 coroutine 正在運行(即它被稱為狀態);「暫停」,如果 coroutine 在呼叫中被暫停,或如果它尚未開始運行;「正常」,如果 coroutine 是活的但未開始運行(即它已經重新呼叫了另一個 coroutine);和「死亡」,如果 coroutine 已經完成了其身體功能,或如果它已經停止了運行。

參數

返回

創建一個新的腳本,包括身體 f。f必須是 Luau 函數。返回每次呼叫時會重新啟動 coroutine 的函數。傳給函數的任何參數都會作為額外參數來恢復。返回與暫停返回的相同值,除了第一個 boolean 外。在發生錯誤時,傳播錯誤。

參數

返回

yield

Tuple<Variant>

暫停呼叫子程序的執行。要提供的任何參數都會傳送為額外結果,以便繼續。在 metamethods 或 C 函數內放棄 coroutine 是禁止的,除了 pcallxpcall 之外。

參數

...: Tuple

返回

Tuple<Variant>