Lua 学习之 coroutine as iterators
在学习Programming in Lua3 Ch9
,书中给出了一个很好的理解iterator
, closure
以及coroutine
的程序示例,现将代码理解注释整理如下:
function permgen (a,n)
n = n or #a
if n <= 1 then
coroutine.yield(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
end
end
function permutations (a)
local co = coroutine.create(function () permgen (a) end)
return function () -- iterator
local code, res = coroutine.resume(co)
--[[ 这个地方充分利用了closure和coroutine的特点。每层递归到最后的n<=1时,通过调用yield暂停递归程序的执行,利用闭包返回当前递归的排序结果。然后通过for迭代,在permutation函数中又resume被暂停的permgen函数,继续下一层递归]]--
return res
end
end
function printResult (a)
for i = 1, #a do
io.write(a[i], " ")
end
io.write("\n")
end
for p in permutations{"a", "b", "c"} do
printResult(p)
end
来看对于迭代器的设计,闭包的理解以及coroutine
的妙用还得慢慢体会啊。