coroutine
*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。
coroutine は、同じスクリプト内の複数のタスクを同時に実行するために使用されます。これらのタスクには、入力から値を生成するか、より大きな問題を解決するためにサブルーチンで作業するなどが含まれます。タスクには、終了ポイントが定義される必要はありませんが、生成
コルーチンを使用中
新しいコルーチンを作成するには、coroutine.create() に機能を提供することです。 作成されたコルーチンは、
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>コルーチンは、別のコルーチンの実行を待っています;つまり、別のコルーチンを再開しました。</td></tr><tr><td><b>死亡した</b></td> <td>機能が停止しました (エラーが返されましたまたは投げられました)。コルーチンは使用できません。</td></tr></tbody>
ステータス | 意味 |
---|
コルーチンをラップする
コルーチンを使用すると、コルーチンオブジェクトの使用を避けることもできます。代わりに、ラッパー関数を使用してコルーチンオブジェクトを使用できます。Such a wrapper function will resume a particular coroutine when it is called and will return only the yielded values. これを coroutine.wrap() で行うことができます:
-- ルーティンを作成し、ラップアップされた関数を返すlocal f = coroutine.wrap(task)-- coroutine.resume() を呼び出した場合、coroutine を再起動します。local result = f()-- エラーが発生すると、ここに上げられます!-- This differs from coroutine.resume() which acts similar to pcall()
Library.coroutine.resume() からの最初の値は、コルーチンがエラーなく実行されたかどうかを記述します。しかし、coroutine.wrap() からの機能は、そうしません:代わりに、coroutine.yield() に直接返されます。コルーチン関数の実
プロデューサーパターンの例
単語の重複を生成するタスクを想像してください:単語の重複を生成するたびに、次のは同じ内容を生成します。たとえば、 Hello を提供すると、 Hello 、 HelloHello 、 2>HelloHello2> などが生成されます。これをするには
-- この関数は、ルーティンが再開されるたびにワードを繰り返します
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")) -- Hello, 真print(coroutine.resume(repetitionCoro)) -- ああ、こんにちはprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
このプロデューサー機能の場合、coroutine.wrap() を使用して、値を生成する関数を取得できます:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- こんにちはprint(f()) -- こんにちはprint(f()) -- HelloHelloHello