Luaでの使用コンシステント

1386 ワード

この間、ゲームの抽選画面を書いていて、タイマーを使っていたので、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プログラミング』