Lua学习(5)——迭代器与泛型for
1. 迭代器
2. 泛型for语义
所谓迭代器就是一种可以遍历一种集合中所有元素的机制。在lua中,迭代器通常表示为函数,每调用依次函数就返回集合中的下一个元素。泛型for 内部保存了迭代器函数
实际保存了3个值:1个迭代器函数,一个恒定状态(invariant state)和一个控制变量(control variable),泛型for语法如下:
for <var-list> in <exp-list> do
<body>
end
简单的例子ipairs()
tb={,,}
for i,v in ipairs(tb) do
print(i,v)
end
自己实现一个迭代器mypairs(tb) 内部使用closure函数,遍历到最后一个元素,返回nil,nil
function mypairs(tb)
local i =
return function()
i=i+
v = tb[i]
if v then
return i, v
else
return nil,nil
end
end
end tb={,,,,}
for i,v in mypairs(tb) do
print(i,v)
end
4. 无状态迭代器
指的是自身不保存任何状态的迭代器。在每此迭代中,for循环都会用恒定状态和控制变量来调用迭代其函数,一个无状态的迭代器可以根据这两个值为下一次迭代生产下一个元素。ipairs就是这样的迭代器
local function iter(a,i)
i=i+
local v=a[i]
if v then
return i,v
end
end function mypairs2(a)
return iter ,a,
end tb={,,,,} for i,v in mypairs2(tb) do
print(i,v)
end [cloud@cloud3 luapro]$ lua hello.lua
pairs函数与ipairs函数一样,不同是pairs使用lua内部基本遍历函数next
function pairs(t)
return next,t,nil
end
也可以直接使用next函数
for k,v in next,tb do
print(k,v)
end
状态迭代器另一个例子是链表迭代器
local function getnext(list,node)
if not node then
return list
else
return node.next
end
end function traverse(list)
return getnext,list,nil
end
list链表的建立,起始list为nil,第一node输入时,val=line,node1的next指向list(nil),然后list指向node1;第二个节点重复这个过程
node2的next指向list(node1),然后list指向node1。 list->node2->node1->nil。 list就是node2
--初始化链表中的数据。
list = nil
for line in io.lines() do
line = { val = line, next = list}
end --以泛型(for)的形式遍历链表。
for node in traverse(list) do
print(node.val)
end
Lua学习(5)——迭代器与泛型for的更多相关文章
- Lua中的迭代器与泛型for
[前言] 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道 ...
- Lua迭代器和泛型for
1.迭代器与closure 在lua中,迭代器通常为函数,每调用一次函数,会返回集合中的下一个元素.每个迭代器在成功调用的时候,都需要保存一些状态,closure(闭包)完美为迭代器运用而生. fun ...
- lua迭代器和泛型for浅析
(一) 首要概念要理清: 1. 在lua中,函数是一种"第一类值",他们具有特定的词法域."第一类值"表示在lua中函数与其他传统类型的值(例如数字和字符串)具 ...
- Step By Step(Lua迭代器和泛型for)
Step By Step(Lua迭代器和泛型for) 1. 迭代器与Closure: 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都 ...
- Lua学习笔记一
学习了有一周多了.之前一直不想献丑,但还是记录下这个过程. 第1章 开发软件搭建 1. ubuntu 下lua安装 sudo apt-get install lua5.1 2.win下的环境搭建. ...
- Lua学习高级篇
Lua学习高级篇 之前已经说了很多,我目前的观点还是那样,在嵌入式脚本中,Lua是最优秀.最高效的,如果您有不同的观点,欢迎指正并讨论,切勿吐槽.这个系列完全来自于<Programming in ...
- Lua 学习笔记(二)
七.再论lua函数 1.lua中的函数被认为是带有词法定界和第一类值 a.词法定界:被嵌套的函数可以访问外部函数的变量 b.第一类值: lua中的函数可以放在变量中 (函数指针?) ...
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- [转]LUA 学习笔记
Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...
随机推荐
- Redis基础学习(三)—Key操作
一.key的相关操作 1.删除 del key1 key2 ... Keyn 作用: 删除1个或多个键. 返回值: 不存在的key忽略掉,返回真正删除的key的数量. 2.重命名 rename k ...
- 设计模式(一)—单例模式
一.概述 1.单例模式的优点 由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象 ...
- myeclipse2017破解失败解决办法
最近,笔者安装的myeclipse2017破解出了问题,破解本来是很简单的事,就是几步而已,但是一直出问题,现在安利一波myeclipse2017版破解失败解决办法.诸如下图:()因为笔者已经破解好了 ...
- PHP初学者如何搭建环境,并在本地服务器(or云端服务器)运行自己的第一个PHP样例
页面底部有PHP代码样例供测试使用. 1.PHP开发,你需要什么? 1)开发代码的工具,可以用IDE名字叫做phpDesigner.当然也可以临时用记事本代替,记得文件扩展名为.php 2)服务器(本 ...
- 数据源C3P0配置
1.导入jar包(dbutil->QueryRunner) 2.C3P0Util工具类 package com.learning.utils; import java.beans.Propert ...
- 为部署ASP.NET Core准备:使用Hyper-V安装Ubuntu Server 16.10
概述 Hyper-V是微软的一款虚拟化产品,和VMWare一样采用的hypervisor技术.它已经被内嵌到Win10系统内,我们只需要进行简单的安装即可.但是前提是要确保你的机器已经启用虚拟化,可以 ...
- 简谈-Python的注释、变量类型、标识符及关键字
在Python程序中,要想支持中文输出,则要在代码前面添加 标识符:开发人员在程序中自定义的一些符号和名称 标示符是自己定义的,如变量名 .函数名等 标识符的规则: 标示符由字目.下划线和数字组成, ...
- 微信小程序后台音乐播放注意事项
wx.seekBackgroundAudio(OBJECT) 作用:控制音乐播放进度. 注意: 该事件 会触发 wx.onBackgroundAudioPlay(CALLBACK) 事件 ,也就是相当 ...
- [C#学习]1.Hello World
在很多时候我们都是被helloworld带入编程的世界的,所以这句话应该算是我们程序员最熟悉的一句话了把.所以在这里,那我也照样以helloworld为例子来引入我们的C#学习. 在往常的hellow ...
- seajs的那些坑
seajs是what? 先看段代码: var loder = {}; var define = loder.define = function(id,deps,factory){ loader[id] ...