《Lua程序设计》9.3 以协同程序实现迭代器 学习笔记
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了《Lua程序设计》9.3 以协同程序实现迭代器 学习笔记,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1668字,纯文字阅读大概需要3分钟。
内容图文
例:编写一个迭代器,使其可以遍历某个数组的所有排列组合形式。代码如下:
function permgen(a, n) n = n or #a -- 默认n为a的大小if n <= 1then-- 还需要改变吗? printResult(a) elsefor i=1,n do-- 将第一个元素放到数组末尾 a[n], a[i] = a[i], a[n] -- 生成其余元素的排列 permgen(a, n-1) -- 恢复第i个元素 a[n], a[i] = a[i], a[n] endendend
然后,还需要定义其中调用到的打印函数printResult,并以适当的参数来调用permgen:
function printResult (a) for i=1,#a doio.write(a[i], "") endio.write("\n") end permgen ({1,2,3,4})
输出如下:
2 3 4 1 3 2 4 1 3 4 2 1 4 3 2 1 2 4 3 1 4 2 3 1 4 3 1 2 3 4 1 2 3 1 4 2 1 3 4 2 4 1 3 2 1 4 3 2 2 4 1 3 4 2 1 3 4 1 2 3 1 4 2 3 2 1 4 3 1 2 4 3 2 3 1 4 3 2 1 4 3 1 2 4 1 3 2 4 2 1 3 4 1 2 3 4
当生成函数完成后,将其转换为一个迭代器就非常容易了。首先,将printResult改为yield:
function permgen (a, n) n - n or #a if n <= 1thencoroutine.yield(a) else <as before>
然后,定义一个工厂方法,用于将生成函数放到一个协同程序中运行,并创建迭代器函数。迭代器指示简单地唤醒协同程序,让其产生下一种排列:
function permutations (a) local co = coroutine.create(function () permgen(a) end) returnfunction () -- 迭代器local code, res = coroutine.resume(co) return res endend
有了上面的函数,在for语句中遍历一个数组中的所有排列就非常简单了:
for p in permutations {"a", "b", "c"} do printResult(p) end--> b c a --> c b a --> c a b --> b a c --> a b c
permutations函数使用了一种在Lua中比较常见的模式,就是将一条唤醒协同程序的调用包装在一个函数中。由于这种模式比较常见,所以Lua专门提供了一个函数coroutine.wrap来完成这个功能。类似于create,wrap创建了一个新的协同程序。但不同的是,wrap并不是返回协同程序本身,而是返回一个函数。每当调用这个函数,即可唤醒一次协同程序。但这个函数与resume的不同之处在于,它不会返回错误代码。当遇到错误时,它会引发错误。若使用wrap,可以这么写permutations:
function permutations (a) return coroutine.wrap(function () permgen(a) end) end
通常,coroutine.wrap比couroutine.create更易于使用。它提供了一个对于协同程序编程实际所需的功能,即一个可以唤醒协同程序的函数。但也缺乏灵活性。无法检查wrap所创建的协同程序的状态,此外,也无法检测出运行时的错误。
原文:http://www.cnblogs.com/moonlightpoet/p/5685899.html
内容总结
以上是互联网集市为您收集整理的《Lua程序设计》9.3 以协同程序实现迭代器 学习笔记全部内容,希望文章能够帮你解决《Lua程序设计》9.3 以协同程序实现迭代器 学习笔记所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。