相乗イテレータとして
特定の例の消費者モデル - 私たちは、ループイテレータはプロデューサーとして見ることができます。反復機能は、消費者ループに値を生成します。相乗イテレータを達成するために使用することができます。コラボレーションの重要な特徴は、それは我々がイテレータ関数は保存状態を返す代わりにイテレータを達成するためにそれを使用しての心配を持っていないので、呼び出し元と呼び出し先の関係を逆転し続けることができるということです。
我々は、素子のアレイのプリントこのアプリケーションを説明するために、すべての順列を達成します。このタスクを達成するために直接書き込み、このような反復的な機能は簡単ではありませんが、すべての配列を生成するために、再帰関数を記述することは難しいことではありません。アイデアは、このている:最後の各々に配列要素は、残りのすべての要素を順次生成し、再帰的に配置されています。コードは以下の通りであります:
function permgen (a, n)
if n == 0 then
printResult(a)
else
for i=1,n do
-- put i-th element as the last one
a[n], a[i] = a[i], a[n]
-- generate all permutations of the other elements
permgen(a, n - 1)
-- restore i-th element
a[n], a[i] = a[i], a[n]
end
Programming in Lua 62
Copyright ® 2005, Translation Team, www.luachina.net
end
end
function printResult (a)
for i,v in ipairs(a) do
io.write(v, " ")
end
io.write("\n")
end
permgen ({1,2,3,4}, 4)
上記発電機では、次の例では、我々は、反復の関数に変換し、それを変更します:
1. 第一步 printResult 改为 yield
function permgen (a, n)
if n == 0 then
coroutine.yield(a)
else
...
2. 第二步,我们定义一个迭代工厂,修改生成器在生成器内创建迭代函数,并使生成器运行在一个协同程序内。迭代函数负责请求协同产生下一个可能的排列。
function perm (a)
local n = table.getn(a)
local co = coroutine.create(function () permgen(a, n) end)
return function () -- iterator
local code, res = coroutine.resume(co)
return res
end
end
这样我们就可以使用 for 循环来打印出一个数组的所有排列情况了:
for p in perm{"a", "b", "c"} do
printResult(p)
end
--> b c a
--> c b a
--> c a b
--> a c b
--> b a c
--> a b c
パーマ機能は、一般的にLuaのモードを使用しています:内部関数でコーディネートコール再開のカプセル化は、このアプローチはLuaの中で非常に一般的であり、Luaはそれゆえ、特別に専用の機能coroutine.wrapを提供します。そして、同じであり、協力プログラムを作成するためにラップを作成します。違いは、共同ラップ自体が返されていない、それは機能が相乗効果が再開されると呼ばれる関数を返します。コラボレーションを再開する時間のラップは戻らないエラーコードが最初の結果として返されるエラーが発生した後、それはエラーがスローされます。私たちは、ラップ書き換えパーマを使用することができます。
function perm (a)
local n = table.getn(a)
return coroutine.wrap(function () permgen(a, n) end)
end
通常の状況下では、coroutine.createシンプルで直感的なよりcoroutine.wrapを使用し、前者はより正確に、我々は必要なものを提供します。機能がコラボレーションを再開することができますが、柔軟性の欠如、状態によって作成されたラップ相乗効果を知る方法はありません、エラーが発生するかどうかを確認する方法はありません。