一、迭代器的定义

     “迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中迭代器以函数的形式表示,即没掉用一次函数,即可返回集合中的“下一个”元素。迭代器的实现可以借助于闭合函数实现,闭合函数能保持每次调用之间的一些状态。
 
 
     上例while迭代需要保存一个迭代器iterator来保证每次获取下一个值,而借助于泛型for则省去了这一步。泛型for会在开始迭代时先创建运行一次迭代器,然后再把值传递给v变量。
 
二、泛型for及无状态的迭代器
     
     上述的迭代器每个新的循环都要创建一个新的闭合函数。这样的开销在某些情况下就会不太容易接受了,然而希望能通过泛型for的自身来保存迭代器状态。
泛型for保存状态的机制在循环的过程中保存了迭代器函数。实际上保存着3个值:迭代器函数、恒定状态、控制变量。
 
     无状态的迭代器:自身不保存任何值状态,每次通过for循环将三种状态值传递进去获得返回值,返回值将在下次循环时继续传入无状态迭代器。
 
 
三、具有复杂状态的迭代器
     
     迭代器的实现:
     1、最简单的方法就是使用闭合函数。
     2、借助泛型for三种状态值的无状态迭代器。
     3、将迭代器所需的所有状态打包为table,保存在恒定状态中。
 
     迭代器通过一个table保存任意多的数据,还能在循环过程中改变这些数据,然而在循环过程中恒定状态中是同一个table。因此,由于这种迭代器可以在恒定状态中保存所有的数据,所以它可以忽略泛型for提供的第二个参数(控制变量)。
 
 
 
     尽可能的尝试编写无状态的迭代器,无状态的迭代器将所有的状态都保存在泛型for中,不需要在开始循环时创建任何新的对象。如果无法使用无状态迭代器,那就就使用闭合函数创建迭代器。闭合函数实现的迭代器要比table的迭代器更为高效。(因为创建一个闭合函数要比创建一个table更廉价,其次访问非局部的变量也比table字段更快)。

Lua 学习笔记(六)迭代器的更多相关文章

  1. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  2. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  3. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  4. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  5. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  9. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  10. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

随机推荐

  1. Java json串生成及转bean

      package com; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import j ...

  2. nodemailer 发邮件

    var transporter = nodemailer.createTransport({//v1.0 above do not use 'SMTP' as first param host: &q ...

  3. 【JSOI2007】【Bzoj1029】建筑抢修

    贪心... 按照T2来进行排序,用堆来进行维护.循环一遍,如果循环时间加上已用时间不超过截止时间,那就ANS++.否则,将它与堆顶判断,如果小于堆顶就把堆顶踢出,把它加入. #include<c ...

  4. ArcGIS10的附件功能

    转自 积思园 http://blog.csdn.net/linghe301/article/details/6386176 老是忘记怎么使用这个ArcGIS10的附件功能,这次就做个记录吧. 在项目应 ...

  5. Response.StatusCode的HTTP状态代码列表

    1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应. · 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分.( ...

  6. 公司内部培训AlwaysOn PPT分享

    公司内部培训AlwaysOn PPT分享 下载地址: http://files.cnblogs.com/files/lyhabc/alwayson.ppt

  7. 架构之路(七)MVC点滴

    我们目前正在开发中的是任务管理系统,一个前端复杂的项目,所以我们先从MVC讲起吧. WebForm 随着ASP.NET MVC的兴起,WebForm已成昨日黄花,但我其实还很想为WebForm说几句. ...

  8. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

  9. MySQL 子分区

    200 ? "200px" : this.width)!important;} --> 介绍 子分区其实是对每个分区表的每个分区进行再次分隔,目前只有RANGE和LIST分区 ...

  10. php性能优化

    序   很长时间没有写博文了,最近换了工作,长时间加班,根本没有时间做其他事情!今天闲下来了,想一想php性能方面的事情.这也是我2014年的第一篇博文! 推荐阅读:初学者到中级者应该掌握的!   p ...