Lua 学习笔记(六)迭代器
2015-03-17 09:55
120 查看
一、迭代器的定义
“迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中迭代器以函数的形式表示,即没掉用一次函数,即可返回集合中的“下一个”元素。迭代器的实现可以借助于闭合函数实现,闭合函数能保持每次调用之间的一些状态。
![](http://images.cnitblog.com/blog2015/645887/201503/170950361889949.png)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(38).png)
上例while迭代需要保存一个迭代器iterator来保证每次获取下一个值,而借助于泛型for则省去了这一步。泛型for会在开始迭代时先创建运行一次迭代器,然后再把值传递给v变量。
二、泛型for及无状态的迭代器
上述的迭代器每个新的循环都要创建一个新的闭合函数。这样的开销在某些情况下就会不太容易接受了,然而希望能通过泛型for的自身来保存迭代器状态。
泛型for保存状态的机制在循环的过程中保存了迭代器函数。实际上保存着3个值:迭代器函数、恒定状态、控制变量。
无状态的迭代器:自身不保存任何值状态,每次通过for循环将三种状态值传递进去获得返回值,返回值将在下次循环时继续传入无状态迭代器。
![](http://images.cnitblog.com/blog2015/645887/201503/170951243768971.png)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(39).png)
三、具有复杂状态的迭代器
迭代器的实现:
1、最简单的方法就是使用闭合函数。
2、借助泛型for三种状态值的无状态迭代器。
3、将迭代器所需的所有状态打包为table,保存在恒定状态中。
迭代器通过一个table保存任意多的数据,还能在循环过程中改变这些数据,然而在循环过程中恒定状态中是同一个table。因此,由于这种迭代器可以在恒定状态中保存所有的数据,所以它可以忽略泛型for提供的第二个参数(控制变量)。
![](http://images.cnitblog.com/blog2015/645887/201503/170954535956255.png)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(40).png)
尽可能的尝试编写无状态的迭代器,无状态的迭代器将所有的状态都保存在泛型for中,不需要在开始循环时创建任何新的对象。如果无法使用无状态迭代器,那就就使用闭合函数创建迭代器。闭合函数实现的迭代器要比table的迭代器更为高效。(因为创建一个闭合函数要比创建一个table更廉价,其次访问非局部的变量也比table字段更快)。
“迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中迭代器以函数的形式表示,即没掉用一次函数,即可返回集合中的“下一个”元素。迭代器的实现可以借助于闭合函数实现,闭合函数能保持每次调用之间的一些状态。
![](http://images.cnitblog.com/blog2015/645887/201503/170950361889949.png)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(38).png)
上例while迭代需要保存一个迭代器iterator来保证每次获取下一个值,而借助于泛型for则省去了这一步。泛型for会在开始迭代时先创建运行一次迭代器,然后再把值传递给v变量。
二、泛型for及无状态的迭代器
上述的迭代器每个新的循环都要创建一个新的闭合函数。这样的开销在某些情况下就会不太容易接受了,然而希望能通过泛型for的自身来保存迭代器状态。
泛型for保存状态的机制在循环的过程中保存了迭代器函数。实际上保存着3个值:迭代器函数、恒定状态、控制变量。
无状态的迭代器:自身不保存任何值状态,每次通过for循环将三种状态值传递进去获得返回值,返回值将在下次循环时继续传入无状态迭代器。
![](http://images.cnitblog.com/blog2015/645887/201503/170951243768971.png)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(39).png)
三、具有复杂状态的迭代器
迭代器的实现:
1、最简单的方法就是使用闭合函数。
2、借助泛型for三种状态值的无状态迭代器。
3、将迭代器所需的所有状态打包为table,保存在恒定状态中。
迭代器通过一个table保存任意多的数据,还能在循环过程中改变这些数据,然而在循环过程中恒定状态中是同一个table。因此,由于这种迭代器可以在恒定状态中保存所有的数据,所以它可以忽略泛型for提供的第二个参数(控制变量)。
![](http://images.cnitblog.com/blog2015/645887/201503/170954535956255.png)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(40).png)
尽可能的尝试编写无状态的迭代器,无状态的迭代器将所有的状态都保存在泛型for中,不需要在开始循环时创建任何新的对象。如果无法使用无状态迭代器,那就就使用闭合函数创建迭代器。闭合函数实现的迭代器要比table的迭代器更为高效。(因为创建一个闭合函数要比创建一个table更廉价,其次访问非局部的变量也比table字段更快)。
相关文章推荐
- Lua学习笔记-9.3章-协同用做迭代器
- Lua学习笔记之迭代器与范型for
- Lua学习笔记 第七章 迭代器与泛型for
- Lua学习笔记8-迭代器
- Lua学习笔记(七):迭代器与泛型for
- Lua学习笔记-迭代器和泛型for
- Lua 学习笔记(六) —— 迭代器和泛型for
- LUA学习笔记(第18-20章)
- Python学习笔记——迭代器(RandSeq和AnyIter)
- Lua学习笔记(九)
- Lua学习笔记1--基本变量类型
- Lua 学习笔记——_ENV和_G
- java学习笔记---迭代器
- Lua学习笔记
- 小羊驼和你一起学习cocos2d-x与lua之一(迭代器pairs 和 ipairs区别)
- 学习lua笔记分享(三)--C#远程加载lua代码
- STL学习笔记--3、迭代器iterator与traits编程
- lua脚本学习笔记
- Lua学习笔记(三)
- C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器