Luaでの使用コンシステント
1386 ワード
この間、ゲームの抽選画面を書いていて、タイマーを使っていたので、Luaの中の協程の使い方について少し勉強して、みんなに共有してもらいました.
まず、コヒーレンスのライフサイクルを理解してみましょう.1つのコヒーレンスには4つの状態があります.サスペンション(suspended)、実行(running)、死亡(dead)、正常(normal)です.
まず、簡単なコラボレーションを作成します.
1行目のコードは関数を含むスレッドを作成し、2行目のコードはこのスレッドを印刷し、3行目のコードはスレッド状態を印刷し、4行目の実行スレッドは、5行目の再印刷状態は、出力を見てみましょう.
直接印刷コヒーレンスは、スレッドのアドレス、すなわち、そのコヒーレンスのアドレスを得ることができることがわかる.その後、コンボが作成されると、デフォルトでは保留状態になり、resumeを使用してコンボを実行できます.そして,コンシステント関数を実行した後,コンシステントの状態は死亡した.
ここを見ると,一般関数に対するコヒーレンスの優位性は全く見られず,かえって煩雑に見える.それはyield()関数を使用していないため、もう一つの例を見ることができます.
コヒーレンス関数では,yield()関数を用いたforループを用いて1〜10の値を順次出力した.
出力を見てみましょう.
ループは1回実行した後に一時停止され、resume関数を実行し続け、順次出力を得ることができます.
注意、10回目の実行が完了すると、協程は死亡に入り、resumeはできません.そうしないと、エラーが発生します.
これにより,通常の関数に対してコヒーレンスがコード内で関数の進捗を制御できることが,コヒーレンスの利点であることが分かった.
参考記事:Roberto Ierusalimschy-『Luaプログラミング』
まず、コヒーレンスのライフサイクルを理解してみましょう.1つのコヒーレンスには4つの状態があります.サスペンション(suspended)、実行(running)、死亡(dead)、正常(normal)です.
まず、簡単なコラボレーションを作成します.
local co = coroutine.create(function() print("HelloWorld") end)
print(co)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
1行目のコードは関数を含むスレッドを作成し、2行目のコードはこのスレッドを印刷し、3行目のコードはスレッド状態を印刷し、4行目の実行スレッドは、5行目の再印刷状態は、出力を見てみましょう.
thread: 00A1D210
suspended
HelloWorld
dead
直接印刷コヒーレンスは、スレッドのアドレス、すなわち、そのコヒーレンスのアドレスを得ることができることがわかる.その後、コンボが作成されると、デフォルトでは保留状態になり、resumeを使用してコンボを実行できます.そして,コンシステント関数を実行した後,コンシステントの状態は死亡した.
ここを見ると,一般関数に対するコヒーレンスの優位性は全く見られず,かえって煩雑に見える.それはyield()関数を使用していないため、もう一つの例を見ることができます.
local co = coroutine.create(function()
for i=1,10 do
print("co",i)
coroutine.yield(i)
end
end)
coroutine.resume(co)
print(coroutine.status(co))
コヒーレンス関数では,yield()関数を用いたforループを用いて1〜10の値を順次出力した.
出力を見てみましょう.
co 1
suspended
ループは1回実行した後に一時停止され、resume関数を実行し続け、順次出力を得ることができます.
co 2
co 3
co 4
......
co 10
注意、10回目の実行が完了すると、協程は死亡に入り、resumeはできません.そうしないと、エラーが発生します.
これにより,通常の関数に対してコヒーレンスがコード内で関数の進捗を制御できることが,コヒーレンスの利点であることが分かった.
参考記事:Roberto Ierusalimschy-『Luaプログラミング』