[Lua]コンシステント
7200 ワード
参照リンク:
https://www.runoob.com/lua/lua-coroutine.html
https://www.jb51.net/article/64691.htm
一.一般的な方法
1.coroutine.create()作成コヒーレンス
2.coroutine.resume()リカバリコヒーレンス
3.coroutine.yield()フック
4.coroutine.status()はコンシステントの状態を返します
テスト:
二.共通のステータス
1.suspended保留状態.コヒーレント(create)とサスペンション(yield)を作成すると、コヒーレントはサスペンション状態になります.
2.running運転状態.コンシステント(resume)を復元すると、コンシステントは実行されます.
3.dead停止状態.コンカレント運転終了後停止状態
テスト:
三.resumeとyield間のデータ交換
1.resumeを呼び出すと、コヒーレントの開始または保留中から実行されます.次のように、resumeを初めて実行すると、パラメータ1,2,3が直接コヒーレントに渡されます.2回目の実行resumeは、保留中から実行され、パラメータ4,5,6がyieldに渡され(次の例2参照)、このとき再びprintが印刷され、初めてコモンに渡されたパラメータが印刷される
2.上記の例を少し修正します.yieldの戻り値がresumeのパラメータであることがわかります
3.上記の例を再度少し修正します.resumeの戻り値はtrueとyieldのパラメータであり、trueは実行に成功したことを示し、エラーが発生した場合falseとエラー情報を返す.
4.resumeの戻り値はtrueとreturnの値であってもよい.returnとyieldの違いは、yield後コヒーレンスが保留状態(suspended)であり、return後コヒーレンスが停止状態(dead)であることである.
まとめ:
resumeとyieldの協力の強さは、resumeがプライマリ・パスにあり、外部状態(データ)を協同プログラムの内部に伝達することである.一方yieldは内部の状態(データ)をメインパスに返す.
https://www.runoob.com/lua/lua-coroutine.html
https://www.jb51.net/article/64691.htm
一.一般的な方法
1.coroutine.create()作成コヒーレンス
2.coroutine.resume()リカバリコヒーレンス
3.coroutine.yield()フック
4.coroutine.status()はコンシステントの状態を返します
テスト:
co = coroutine.create(function ()
for i = 1, 10 do
print(i)
coroutine.yield()
end
end)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
-- :
-- 1
-- 2
-- 3
二.共通のステータス
1.suspended保留状態.コヒーレント(create)とサスペンション(yield)を作成すると、コヒーレントはサスペンション状態になります.
2.running運転状態.コンシステント(resume)を復元すると、コンシステントは実行されます.
3.dead停止状態.コンカレント運転終了後停止状態
テスト:
co = coroutine.create(function ()
print(coroutine.status(co))
print("hi")
end)
print(coroutine.status(co))
coroutine.resume(co)
print(coroutine.status(co))
-- :
-- suspended
-- running
-- hi
-- dead
三.resumeとyield間のデータ交換
1.resumeを呼び出すと、コヒーレントの開始または保留中から実行されます.次のように、resumeを初めて実行すると、パラメータ1,2,3が直接コヒーレントに渡されます.2回目の実行resumeは、保留中から実行され、パラメータ4,5,6がyieldに渡され(次の例2参照)、このとき再びprintが印刷され、初めてコモンに渡されたパラメータが印刷される
co = coroutine.create(function (a, b, c)
print("co", a, b, c)
coroutine.yield()
print("co2", a, b, c)
end)
coroutine.resume(co, 1, 2, 3)
coroutine.resume(co, 4, 5, 6)
-- :
-- co 1 2 3
-- co2 1 2 3
2.上記の例を少し修正します.yieldの戻り値がresumeのパラメータであることがわかります
co = coroutine.create(function (a, b, c)
print("co", a, b, c)
print(coroutine.yield())
print("co2", a, b, c)
end)
coroutine.resume(co, 1, 2, 3)
coroutine.resume(co, 4, 5, 6)
-- :
-- co 1 2 3
-- 4 5 6
-- co2 1 2 3
3.上記の例を再度少し修正します.resumeの戻り値はtrueとyieldのパラメータであり、trueは実行に成功したことを示し、エラーが発生した場合falseとエラー情報を返す.
co = coroutine.create(function (a, b, c)
print("co", a, b, c)
print(coroutine.yield("haha", 999))
print("co2", a, b, c)
end)
print(coroutine.resume(co, 1, 2, 3))
print(coroutine.resume(co, 4, 5, 6))
-- :
-- co 1 2 3
-- true haha 999
-- 4 5 6
-- co2 1 2 3
-- true
4.resumeの戻り値はtrueとreturnの値であってもよい.returnとyieldの違いは、yield後コヒーレンスが保留状態(suspended)であり、return後コヒーレンスが停止状態(dead)であることである.
co = coroutine.create(function ()
return 6, 7
end)
print(coroutine.resume(co))
print(coroutine.resume(co))
-- :
-- true 6 7
-- false cannot resume dead coroutine
まとめ:
resumeとyieldの協力の強さは、resumeがプライマリ・パスにあり、外部状態(データ)を協同プログラムの内部に伝達することである.一方yieldは内部の状態(データ)をメインパスに返す.