ちなみに第1回は「Lua入門 (全17回) - プログラミングならドットインストール」でした。
関数の途中で呼び出し元に処理を戻し、再度呼び出された時は続きから再開出来る。
co = coroutine.create(function()
coroutine.yield("Hello");
coroutine.yield("Lua");
coroutine.yield("!!!");
end)
print (coroutine.resume(co))
print (coroutine.resume(co))
print (coroutine.resume(co))
coroutine.create
でコルーチンを作成します。これはハンドルを返すだけで実行はしません。
コルーチンはcoroutine.resume
で実行します。
コルーチンを実行すると、そのコルーチンが終了するかcoroutine.yield
を呼び出すまで実行します。
coroutine.yield
を呼ぶと、コルーチンは中断されて直ちに呼び出し元のcoroutine.resume
に戻ります。
中断されるとtrue
とcoroutine.yield
に渡された引数を返します。
function hello()
coroutine.yield("Hello");
coroutine.yield("Lua");
coroutine.yield("!!!");
return "END"
end
hello_co = coroutine.wrap(hello)
print(hello_co())
print(hello_co())
print(hello_co())
print(hello_co())
既存の関数をコルーチンにするにはcoroutine.wrap
を使います。
coroutine.create
と違い、コルーチン自信ではなくコルーチンを再開する関数を返します。
この関数を実行するとcoroutine.resume
の返り値の、最初の最初のブーリアン以外をすべて返します。
ちなみにgolangでの簡単な実装はこんな感じです。
コルーチンを利用してジェネレータとして使用する例です。
function fib()
local a = 0
local b = 1
coroutine.yield(a)
coroutine.yield(b)
while true do
local v = a + b
a = b
b = v
coroutine.yield(v)
end
end
fib_co = coroutine.wrap(fib)
for i = 1, 10 do
print(fib_co())
end
ちなみにgolangでの簡単な実装はこんな感じです。
資料をまとめるのが間に合いませんでした...ごめんなさい!!!