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的妙用还得慢慢体会啊。
本文详细解读了使用Lua编程语言中coroutine实现迭代器的技巧,结合closure特性,展示了如何高效地生成排列组合。通过具体代码实例,深入探讨了闭包、迭代器与coroutine在解决特定问题时的巧妙应用。

6203

被折叠的 条评论
为什么被折叠?



