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 を提供すると、Hello、HelloHello、HelloHelloHello などが生成されます。これを行うには、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、HelloHelloprint(coroutine.resume(repetitionCoro)) -- true, HelloHelloHello
このプロデューサー関数では、coroutine.wrap() を使用して、値を生成する機能を取得できます:
local f = coroutine.wrap(repeatThis)print(f("Hello")) -- こんにちはprint(f()) -- こんにちはHelloprint(f()) -- HelloHelloHello
概要
関数
提供されたコルーチンを死状態に閉じ、そして配置します。
体 f が Luau 関数である必要がある新しいコルーチンを作成します。
この関数のコルーチンが安全に生成できる場合、true を返します。
コルーチンの実行を開始または継続します co。
実行中のコルーチンを返します。
コルーチンコのステータスをストリングとして返します。
新しいコルーチンを作成し、呼び出されるとコルーチンを再開する機能を返します。
コルーチンの実行を停止します。
関数
resume
コルーチンの実行を開始または継続します co。コルーチンを再開する最初の時に、その体を実行開始します。値 ... は、ボディ機能の引数としてパスされます。コルーチンが引き渡された場合、再起動を再開します;値 ... は、引き渡しの結果としてパスされます。コルーチンがエラーなしで実行される場合、コルーチンが返す休憩を再開し、またはボディ関数によって返された値 (コルーチンが返す場合) またはボディ機能によって返された値 (コルーチンが終了する場合) を追加します。エラーが発生した場合は、返済を再開してエラーメッセージと一緒に false を返します。