Lua迭代器
在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素.迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,可以通过闭包提供的机制来实现这个任务(闭包中的外部局部变量可以用来保存状态)。一个典型的闭包结构包含两个函数:一个是闭包自己,另一个是工厂(创建闭包的函数).
function list_iter(t)
local i=
local n=table.getn(t)
return function()
i=i+
if i<=n then return t[i] end
end
end t={,,}
for elem in list_iter(t) do
print(elem)
end
--返回的是函数
function iterator(t)
local i=
local n=table.getn(t)
return function()
i=i+
if i<=n then
return t[i]
end
end
end t={,,} iter=iterator(t)--获取迭代器
while true do
local e=iter()
if e==nil then break end
print(e)
end
范性for的语义:
for var_1,...,var_n in explist do block end
--等价于
do
local _f ,_s,_var=explist--返回迭代函数、状态常量、控制变量
while true do
local var_1,...,var_n =_f(_s,_var)
_var=var_1
if _var==nil then break end
block
end
end
无状态的迭代器:不保留任何状态的迭代器,避免创建闭包花费额外的代价.
function iter(a,i)
i=i+
local v=a[i]
if v then
return i,v
end
end function _ipairs(a)
return iter,a,
end a={"one","two","three"}
--调用_ipairs(a)开始循环时,获取三个值:迭代函数、状态常量a,控制变量初始值0
for i,v in _ipairs(a) do
print(i,v)
end
应该尽可能的写无状态的迭代器,这样循环的时候由for来保存状态;如果不能用无状态的迭代器实现,应尽可能使用闭包,尽可能不要使用table这种方式,因为创建闭包的代价要比创建table小,另外lua处理闭包要比处理table速度快些。
local iterator function allwords()
local state={line=io.read(),pos=}--使用table保存状态常量、控制变量
return iterator,state
end function iterator(state)
while state.line do
local s,e=string.find(state.line,"%w+",state.pos)
if s then
state.pos=e+
return string.sub(state.line,s,e)
else
state.line=io.read()
state.pos=
end
return nil
end
end
Lua迭代器的更多相关文章
- Lua 迭代器
第一种:lua迭代器的实现依赖于闭包(closure)特性 1.1 第一个简单的写法 --迭代器写法 function self_iter( t ) local i = 0 return functi ...
- Lua学习十一----------Lua迭代器
© 版权声明:本文为博主原创文章,转载请注明出处 Lua迭代器 - 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址 - Lu ...
- Step By Step(Lua迭代器和泛型for)
Step By Step(Lua迭代器和泛型for) 1. 迭代器与Closure: 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都 ...
- Lua迭代器和泛型for
1.迭代器与closure 在lua中,迭代器通常为函数,每调用一次函数,会返回集合中的下一个元素.每个迭代器在成功调用的时候,都需要保存一些状态,closure(闭包)完美为迭代器运用而生. fun ...
- lua迭代器和仿制药for
不管是什么样的结构,你只需要同意遍历集合可以称为迭代器的所有元素.lua常用来形容叙事功能迭代器.个元素.每个迭代器都须要保存一些状态来知道当前处于什么位置和怎样进行下一次迭代. 对于这种任务.闭包提 ...
- lua迭代器和泛型for浅析
(一) 首要概念要理清: 1. 在lua中,函数是一种"第一类值",他们具有特定的词法域."第一类值"表示在lua中函数与其他传统类型的值(例如数字和字符串)具 ...
- Lua 迭代器与closure
所谓“迭代器”就是一种可以遍历(iterate over)一种极和中所有元素的机制.在Lua中,通常将迭代其表示为函数.每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间 ...
- [Lua] 迭代器 闭合函数 与 泛型for
首先看看一下闭合函数(closure),见如下代码: function newCounter() local i = 0 -- 非局部变量(non-local variable) return fun ...
- Lua 学习笔记(九)协同程序(线程thread)
协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...
随机推荐
- js获取select选中的标签option的值
js中获取方法 var obj = document.getElementByIdx_xx_x(”testSelect”); //定位id var index = obj.selectedInde ...
- JAVA 学习笔记 - 反射机制
1. JAVA反射机制的概念 2. 怎样实例化一个 Class对象 Class.forName(包名.类名); 对象.getClass(); 类.class; ================== ...
- fedora配置ip
fedora20配置静态ip 原创 2015年08月08日 14:36:01 标签: fedora / linux / 网络配置 / ip配置 / 网络设置 2403 在linux的世界里,给主机设置 ...
- jQuery 点击查看 收起
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- day25-2 OSI协议和socket抽象层
目录 OSI协议 物理层 数据链路层 以太网协议 Mac地址 广播地址 网络层 获取对方Mac地址(ARP协议) 传输层 TCP协议 UDP协议 应用层 socket抽象层 OSI协议 互联网的本质就 ...
- CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...
- CAS机制总结
一.简介 CAS机制:(Compare and set)比较和替换 简单来说–>使用一个期望值来和当前变量的值进行比较,如果当前的变量值与我们期望的值相等,就用一个新的值来更新当前变量的值CAS ...
- CAD使用DeleteXData删除数据(com接口)
主要用到函数说明: MxDrawEntity::DeleteXData 删除扩展数据,详细说明如下: 参数 说明 pzsAppName 删除的扩展数据名称,如果为空,删除所有扩展数据 c#代码实现如下 ...
- Duplicate fragment name ERROR Jetty Maven Plugin
http://stackoverflow.com/questions/5802096/duplicate-fragment-name-error-jetty-maven-plugin 4down vo ...
- Android突破64K限制
1.添加依赖 android{ defaultConfig{ ... multiDexEnabled true ... } } dependencies{ compile 'com.android.s ...