不管是什么样的结构,你只需要同意遍历集合可以称为迭代器的所有元素。lua常用来形容叙事功能迭代器。个元素。每个迭代器都须要保存一些状态来知道当前处于什么位置和怎样进行下一次迭代。

对于这种任务。闭包提供了非常好的机制来完毕。一个典型的闭包结构包括两个函数:一个是闭包自身,一个是创建闭包的工厂。

比如,我们能够写过简单的list迭代器,让他只返回值。

function values( t )

     local i = 0;

     return function() i = i + 1;return t[i] end

end



tb = {33, 44, 55}



for v in values(tb) do

     print(v)

end
泛型for簿记全部迭代循环,首先调用迭代工厂,并内部保存迭代函数。每次迭代时调用新的迭代函数。但迭代器返回nil循环结束。

上面的迭代器有个瑕疵:须要创建一个闭包。创建闭包是须要代价的。仅仅是大部分情况下都没问题,然而有些情况却是不能容忍这个代价的。这时的解决方法是使用泛型for。泛型for本身保存迭代状态。包含迭代函数。状态常量。控制变量,因此不必付出闭包的代价,称这样的迭代器为无状态迭代器。

泛型for的语法:
for <var-list> in <exp-list> do
     <body>
end
运行过程:
1.初始化迭代函数,状态常量,控制变量,不足补nil,多出忽略。
2.状态常量。控制变量作为參数调用迭代函数。
3.将迭代函数返回的值付给变量列表。

4.假设返回的第一个值为nil。则循环结束,否则运行循环体。

5.回到第2步。



假设遇到须要保存多个状态,还有种方法是将全部状态封装到表中。实际上,我们不推荐这么写。

由于创建闭包的代价比创建表的要小。和lua处理速度更快封闭。有更强大的和复杂的方法是使用协同作用以创建一个迭代。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

最新文章

  1. bzoj1500
  2. 关于onmouseover和onmouseout的bug
  3. ACM 寻找最大数
  4. [异常] JLink Error: Could not find supported CPU core on JTAG chain J-Link连接不到stm32内核问题
  5. python学习易错点1
  6. yum的一些用法
  7. Java实战之02Hibernate-04多表映射
  8. javascript 事件代理及应用
  9. shakes hands
  10. windows环境Caffe安装配置步骤(无GPU)及mnist训练
  11. 《Javascript_Dom 编程艺术》(第2版)读书笔记
  12. void指针和const指针
  13. sql server Local Service, Local System or Network Service
  14. HDU 1247 - Hat’s Words - [字典树水题]
  15. python基础(六)——mysql的使用
  16. git flow分支管理
  17. c# 多线程和异步
  18. 部署虚拟环境安装Linux系统
  19. oracle序列的创建和使用
  20. 某谷 P5159 WD与矩阵

热门文章

  1. android adb 不同的方式使用特定的解释
  2. 正则、grep、sed、awk
  3. lua三底漆:lua转让c/c++库(动态链接模式)
  4. Java达到MySQL数据库备份(两)
  5. JBPM4实例教程
  6. Docker安装应用程序(Centos6.5_x64)
  7. HDU1069_Monkey and Banana【LCS】
  8. NSIS:在线下载并安装程序
  9. 从涂鸦到发布——理解API的设计过程(转)
  10. 安装程序添加iis的方法经验分享