1. 第一种:lua迭代器的实现依赖于闭包(closure)特性

1.1 第一个简单的写法

--迭代器写法
function self_iter( t )
local i = 0
return function ()
i = i + 1;
return t[i]
end
end
-- 使用
local t = {10, 20, 30}
local iter = self_iter(t) -- 这里就是使用了闭包函数的特性
while true do
local element = iter()
if element == nil then break end
print(element)
end
  1. 第二种:使用泛型for实现

    2.1 语法
for <var-list> in <exp-list> do
<body>
end
2.2 泛型for理解:for做的第一件事就是对in后面的表达式进行求值,返回3个值,分别是迭代器函数(iter),恒定变量(table),控制变量(i),之后就会使用恒定变量和控制变量来调用迭代器函数

2.3 泛型for迭代器实现例子
-- 迭代器
local function self_iter( list, i )
i = i + 1
local v = list[i]
print(v)
if v then
return i, v
end
end -- for 初始化
function self_ipairs( list )
return self_iter, list, 0
end -- 使用
local a = {10, 20, 40} for k, v in self_ipairs(a) do
print(k, ' ', v)
end
  • 注:各种复杂的迭代器实现就是对迭代器函数(iter)和恒定变量(table)的各种变形

Lua 迭代器的更多相关文章

  1. Lua学习十一----------Lua迭代器

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua迭代器 - 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址 - Lu ...

  2. Step By Step(Lua迭代器和泛型for)

    Step By Step(Lua迭代器和泛型for) 1. 迭代器与Closure:    在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都 ...

  3. Lua迭代器和泛型for

    1.迭代器与closure 在lua中,迭代器通常为函数,每调用一次函数,会返回集合中的下一个元素.每个迭代器在成功调用的时候,都需要保存一些状态,closure(闭包)完美为迭代器运用而生. fun ...

  4. lua迭代器和仿制药for

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

  5. lua迭代器和泛型for浅析

    (一) 首要概念要理清: 1. 在lua中,函数是一种"第一类值",他们具有特定的词法域."第一类值"表示在lua中函数与其他传统类型的值(例如数字和字符串)具 ...

  6. Lua 迭代器与closure

    所谓“迭代器”就是一种可以遍历(iterate over)一种极和中所有元素的机制.在Lua中,通常将迭代其表示为函数.每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间 ...

  7. [Lua] 迭代器 闭合函数 与 泛型for

    首先看看一下闭合函数(closure),见如下代码: function newCounter() local i = 0 -- 非局部变量(non-local variable) return fun ...

  8. Lua迭代器

    在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素.迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,可以通过闭包提供的机制来实现这个任务(闭包中的外部局部变量可以用 ...

  9. Lua 学习笔记(九)协同程序(线程thread)

    协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...

随机推荐

  1. ckplayer 项目实战

    <div class="control-group" id="videoDiv" style="display: none;"> ...

  2. deepin2014.1快捷键

    初试deepin2014.1,发现windows很多快捷键在deepin中也完美支持,举例如下: ctrl+shift+n : 新建文件夹 窗口键+E:打开文件系统 窗口键+TAB:3D切换桌面 al ...

  3. OpenCV2.x自学笔记——Qt5.5.1打包exe

    [简易步骤] 1.Release模式下生成exe,在release文件夹内,如jujube.exe 2.exe单独拷贝到一个文件夹,如D:\jujube\jujube.exe 3.打开Qt 官方开发环 ...

  4. Infix to postfix without '(' and ')'

    #include<iostream> #include<stack> #include<string> #include<deque> using na ...

  5. 从零开始学Axure原型设计(高级篇)

    如果你熟悉了Axure的部件库,那么你可以得心应手地画出心目中产品的线框图:如果你会用Axure的母版.动态面板功能,那么你应该能够画出一些简单网站的原型图:但只有你精通了Axure的条件逻辑.变量. ...

  6. ocean所用的蝴蝶纹理

    #include <ork/render/FrameBuffer.h> #include <ork/scenegraph/SceneManager.h> #include &l ...

  7. Nimbus<一>Storm系列(五)架构分析之Nimbus启动过程

    启动流程图 mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj\b ...

  8. Java 字符串比较,String 中的一些方法 == 和 equals 的详解

    "==" 是比较的是两个对象的内存地址,而equals方法默认情况下是比较两个对象的内存地址. 1.String str = "hello"  生成的字符串,首 ...

  9. 1.建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理。

    package d0923; public class TestException { public static void main(String[] args) { for(int i=0;i&l ...

  10. HIVE 简单总结

    hive 1 table 查看 表show tables;查看表结构desc table_name; 2 database 默认 default 创建databasecreate database_n ...