Menu
Coddy logo textTech

コルーチンの状態確認

CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 52/54。

コルーチンを扱う際、コルーチンがどのような状態にあるかを知る必要があることがよくあります。現在実行中ですか?一時停止して再開を待っていますか?それとも実行を完了しましたか?

Luaは、これらの質問に答えるために coroutine.status() 関数を提供します。

coroutine.status() 関数は、コルーチンを引数として受け取り、その現在の状態を表す文字列を返します。可能な状態は3つあります:

"suspended"コルーチンは yield() で一時停止しており、再開可能です
"running"コルーチンは現在実行中です
"dead"コルーチンは実行を終了しており、再度再開することはできません

使い方は以下の通りです:

function task()
    coroutine.yield()
    print("Finishing")
end

local co = coroutine.create(task)
print(coroutine.status(co))  -- "suspended"

coroutine.resume(co)
print(coroutine.status(co))  -- "suspended" (yieldで一時停止中)

coroutine.resume(co)
print(coroutine.status(co))  -- "dead" (終了)
challenge icon

チャレンジ

簡単

resumeCount を受け取り、コルーチンのライフサイクルの異なる時点でのステータスを示す文字列を返す関数 checkCoroutineLifecycle を作成してください。

一度 yield してから完了するコルーチンを作成します。作成直後、最初の resume 後(yield で一時停止しているとき)、および resumeCount に基づくその後の resume 後のステータスを確認し、記録してください。

ロジック:

  • 文字列 "paused" を一度 yield し、その後完了する関数を作成します
  • coroutine.create() を使用して、この関数をコルーチンにラップします
  • 作成直後に coroutine.status() を使用してステータスを確認します
  • コルーチンを一度 resume し、再度そのステータスを確認します
  • resumeCount - 1 に基づいて追加でコルーチンを resume します(合計 resume 回数 = resumeCount
  • すべての resume が終わった後の最終的なステータスを確認します
  • これら3つのステータスを initial: [status]\\nafter first resume: [status]\\nfinal: [status] という形式の文字列で返します

引数:

  • resumeCount (数値): コルーチンを resume する合計回数(最小 1)

戻り値: ライフサイクルの3つの時点でのコルーチンのステータスを示す文字列。形式: initial: suspended\nafter first resume: suspended\nfinal: dead

チートシート

coroutine.status() 関数は、コルーチンの現在の状態を文字列として返します。

考えられる状態:

  • "suspended" - コルーチンは yield() で一時停止しており、再開可能です
  • "running" - コルーチンは現在実行中です
  • "dead" - コルーチンは実行を終了しており、再開できません

使用法:

coroutine.status(coroutine_object)

例:

function task()
    coroutine.yield()
    print("Finishing")
end

local co = coroutine.create(task)
print(coroutine.status(co))  -- "suspended"

coroutine.resume(co)
print(coroutine.status(co))  -- "suspended"

coroutine.resume(co)
print(coroutine.status(co))  -- "dead"

自分で試してみよう

function checkCoroutineLifecycle(resumeCount)
    -- ここにコードを記述してください
end
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン