coroutine

非推奨を表示

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

A コルーチン は、同じスクリプト内で複数のタスクを同時に実行するために使用されます。このようなタスクには、入力から値を生成するか、より大きな問題を解決するときにサブルーチンで作業するなどが含まれます。タスクは終了地点を定義する必要はありませんが、他のものを処理するために 休憩 を行う特定の時間を定義する必要があります。

コルーチンを使用する

新しいコルーチンは、coroutine.create() に機能を提供することで作成できます。作成されたら、コルーチンは、引数を関数に渡す最初の呼び出し coroutine.resume() まで実行を開始しません。この呼び出しは、機能が停止するか、coroutine.yield() を呼び出し、これが発生すると、coroutine.resume() は、機能によって返される値、coroutine.yield() に送信された値、またはエラーメッセージを返します。エラーが発生した場合、2番目の返却値は投げられたエラーです。


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) --> true、最初(coroutine.yield() と呼ばれるタスク)
-- 続行して機能を実行し、結果が得られるか停止するまで
success, result = coroutine.resume(taskCoro)
print(success, result) --> true, second (task halted because it returned "second")

コルーチンのライフタイム中、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() を呼んだかのようにコルーチンを再開する
local result = f()
-- エラーが発生すると、ここで上げられます!
-- This differs from coroutine.resume() which acts similar to pcall()

coroutine.resume() から返された最初の値は、コルーチンがエラーなしで実行されたかどうかを説明します。しかし、coroutine.wrap() によって返される機能は、これを行わない:代わりに、値が返されたか、coroutine.yield() に送信された場合、直接返されます。コルーチン関数を実行中にエラーが発生した場合、返された関数の呼び出しでエラーが発生します。

生産者パターンの例

単語の繰り返しを生成するタスクを想像してください:繰り返しを生成するたびに、次のものはもう一つ生成します。たとえば、Hello を提供すると、HelloHelloHelloHelloHelloHello などが生成されます。これを行うには、repeatThis() を定義できます:


-- この関数は、コルーチンが再開されるたびに単語を繰り返します
local function repeatThis(word)
local repetition = ""
while true do
-- 1回繰り返して結果を返す
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)) -- true、HelloHello
print(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello

このプロデューサー関数では、coroutine.wrap() を使用して、値を生成する機能を取得できます:


local f = coroutine.wrap(repeatThis)
print(f("Hello")) -- こんにちは
print(f()) -- こんにちはHello
print(f()) -- HelloHelloHello

概要

関数

  • close(co : coroutine):boolean,Variant<string, ()>

    提供されたコルーチンを死状態に閉じ、そして配置します。

  • 体 f が Luau 関数である必要がある新しいコルーチンを作成します。

  • この関数のコルーチンが安全に生成できる場合、true を返します。

  • resume(co : coroutine,... : Variant):boolean,Variant<Tuple, string>

    コルーチンの実行を開始または継続します co

  • 実行中のコルーチンを返します。

  • コルーチンコのステータスをストリングとして返します。

  • 新しいコルーチンを作成し、呼び出されるとコルーチンを再開する機能を返します。

  • yield(... : Tuple):Tuple<Variant>

    コルーチンの実行を停止します。

関数

close

提供されたコルーチンを死状態に閉じ、そして配置します。この関数は、コルーチンがエラー状態にある場合を除き、true を返し、エラーメッセージと false を返します。現在実行中のコルーチンは閉じることができません。コルーチンは閉じた後再開することはできません。

パラメータ

戻り値

true コルーチンが閉じられている状態がエラー状態でない限り、閉じられているコルーチンはエラー状態にない。

Variant<string, ()>

エラーメッセージ、もしあれば。

create

体 f が Luau 関数である必要がある新しいコルーチンを作成します。

パラメータ

戻り値

isyieldable

この関数のコルーチンが安全に生成できる場合、true を返します。メタメソッドまたは C 関数内でコルーチンを放棄することは禁止され、pcallxpcall を除きます。

戻り値

コルーチンがこの時点で安全に生成できるかどうか。

resume

コルーチンの実行を開始または継続します co。コルーチンを再開する最初の時に、その体を実行開始します。値 ... は、ボディ機能の引数としてパスされます。コルーチンが引き渡された場合、再起動を再開します;値 ... は、引き渡しの結果としてパスされます。コルーチンがエラーなしで実行される場合、コルーチンが返す休憩を再開し、またはボディ関数によって返された値 (コルーチンが返す場合) またはボディ機能によって返された値 (コルーチンが終了する場合) を追加します。エラーが発生した場合は、返済を再開してエラーメッセージと一緒に false を返します。

パラメータ

...: Variant

戻り値

running

実行中のコルーチンを返します。

戻り値

status

コルーチンが実行中である場合は、ストリングとして coroutine の状態を返します:「状況行」、コルーチンが呼び出されている場合は「一時停止」、まだ実行を開始していない場合は「普通」、コルーチンがアクセス中であるか、またはエラーで停止している場合は「死」、コルーチンがボディ機能を終了した場合、またはまだ実行を開始していない場合は「休憩」です。

パラメータ

戻り値

体 f を持つ新しいコルーチンを作成するf は Luau 関数でなければなりません。呼び出されるたびにコルーチンを再開する関数を返します。機能に渡されたすべての引数は、再開する追加引数として動作します。再開によって返された値と同じを返し、最初のブールを除きます。エラーの場合、エラーを拡散します。

パラメータ

戻り値

yield

Tuple<Variant>

呼び出しコルーチンの実行を停止します。生成するすべての引数は、再開するための追加結果としてパスされます。メタメソッドまたは C 関数内でコルーチンを放棄することは禁止され、pcallxpcall を除きます。

パラメータ

...: Tuple

戻り値

Tuple<Variant>