Lua学习十一----------Lua迭代器
© 版权声明:本文为博主原创文章,转载请注明出处
Lua迭代器
- 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址
- Lua迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素
泛型for迭代器
- 泛型for的执行过程:
1)初始化,计算in后面表达式的值,表达式应该返回泛型for需要的三个值:迭代函数、状态常量、控制变量;个数不足用nil补充,多余忽略
2)将状态常量和控制变量作为参数调用迭代函数(对于for结构来说,状态常量没有作用,仅仅在初始化时获取它的值并传递给迭代变量)
3)将迭代函数返回的值赋给变量列表
4)如果返回的第一个值为nil,循环结束;否则执行循环体
5)回到第二步,再次调用迭代函数
- 默认的迭代函数
1)pairs:迭代table,可以遍历表中的所有key,可以返回nil
2)ipairs:迭代数组,从下标1开始升序遍历,遇到nil则退出
无状态的迭代器
- 无状态的迭代器是指不保留任何状态的迭代器,因此在循环中可以利用无状态迭代器避免创建闭包发费的额外代价
- 每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值作为参数被调用
- ipairs是最简单的典型例子
多状态的迭代器
- 很多情况下,迭代器需要保存多个状态信息而不是简单的状态常量和控制变量。
- 方法一是使用闭包
- 方法二是将所有的状态信息封装到table中,将table作为迭代器的状态常量
实例
print("泛型for迭代器")
array = {
[1] = "V1",
[3] = "V2",
key = "V3"
}
for k, v in pairs(array) do
print(k .. " : " .. v)
end
print()
for k, v in ipairs(array) do
print(k .. " : " .. v)
end
print("无状态的迭代器:实现数字n的平方")
function square(iteratorMaxCount, currentNumber)
if iteratorMaxCount > currentNumber then
currentNumber = currentNumber + 1
return currentNumber, currentNumber * currentNumber
end
end
for i, n in square, 3, 0 do
print(i, n)
end
print("多状态的迭代器:计算集合大小并输出各个元素")
array = {"Lua", "Tutorial"}
function elementIterator(collection)
local index = 0
local count = #collection
-- 闭包函数
return function()
index = index + 1
if index <= count then
-- 返回迭代器当前元素
return collection[index]
end
end
end
for element in elementIterator(array) do
print(element)
end
参考:http://www.runoob.com/lua/lua-iterators.html
Lua学习十一----------Lua迭代器的更多相关文章
- Lua学习---编译生成lua和luac
众所周知,Lua是一种强大的脚本语言,并且这种语言是用C语言实现的.为什么要学习这门语言?因为它可以增强我看C语言代码的功底. 我下的Lua版本是Lua5.3,关于Lua5.3的简介如下: http: ...
- Lua学习2 Lua小框架的搭建
看了上一篇Lua环境搭建具体http://blog.csdn.net/liuwumiyuhuiping/article/details/9196435 为了方便学习. 具体新开始搭建一下学习的小框架. ...
- Lua学习五----------Lua循环
© 版权声明:本文为博主原创文章,转载请注明出处 1.循环类型 1.1 while循环 - 语法:while(condition) do ...<执行语句> end - 解析:判断cond ...
- lua学习:lua中“类”的实现
在之前的面试遇到考用lua实现类的题目.现在就补补这块知识点. 我们都知道Lua中的table是一个对象.拥有状态,拥有self,拥有独立于创建者和创建地的生命周期. 一个类就是一个创建对象的模具.L ...
- Lua学习十----------Lua数组
© 版权声明:本文为博主原创文章,转载请注明出处 1.LUA数组 - 一维数组 - 多维数组 2.array.lua -- 一维数组 print("一维数组") array1 = ...
- Lua学习九----------Lua字符串
© 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...
- Lua学习八----------Lua运算符
© 版权声明:本文为博主原创文章,转载请注明出处 1.Lua运算符: - 算术运算符:+(加法).-(减法).*(乘法)./(除法-取整).%(除法-取余).^(乘幂).-(负号) - 关系运算符:= ...
- Lua学习七----------Lua函数
© 版权声明:本文为博主原创文章,转载请注明出处 1.Lua函数 - 完成指定的任务,这种情况下函数作为调用语句使用 - 计算并返回值,这种情况下函数作为赋值语句的表达式使用 - Lua函数可以返回多 ...
- Lua学习六----------Lua流程控制
© 版权声明:本文为博主原创文章,转载请注明出处 Lua流程控制 - 通过程序设定一个或多个条件语句 - 在条件为true时执行指定程序代码,在条件为false时指定其他指定程序代码 - 控制结构语句 ...
随机推荐
- Java IO 学习(五)跟踪三个文件IO方法的调用链
假设我们想要用Java读取一个二进制文件,有好几种方式,本文会选取其中比较典型的三种方式进行详细分析 0. 准备工作 安装openjdk-1.8.0.141(普通的jdk中涉及IO的很多代码是闭源的, ...
- servlet方法
1.每一个Servlet都必须要实现Servlet接口,GenericServlet是个通用的.不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于Generi ...
- Xamarin XAML语言教程隐藏文件使用Progress属性设置进度条
Xamarin XAML语言教程隐藏文件使用Progress属性设置进度条 Xamarin XAML语言教程隐藏文件中使用Progress属性设置进度条进度,开发者除了可以在XAML中使用Progre ...
- [BZOJ2460][BJOI2011]元素(线性基)
2460: [BeiJing2011]元素 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2195 Solved: 1119[Submit][Sta ...
- [POI2008]Mirror Trap
题目大意: 一个$n(n\le10^5)$个顶点的格点多边形,每条边平行于网格线,每个角度数均为$90^\circ$或$270^\circ$,周长小于$3\times10^5$,每个顶点可以安装激光发 ...
- PHP switch的“高级”用法详解
只所以称为“高级”用法,是因为我连switch的最基础的用法都还没有掌握,so,接下来讲的其实还是它的基础用法! switch 语句和具有同样表达式的一系列的 IF 语句相似.很多场合下需要把同一个变 ...
- Debian下载地址
http://cdimage.debian.org/cdimage/archive/
- centos下mysql集群初尝试
原文:http://www.lvtao.net/database/mysql-cluster.html 五台服务器篇 安装要求 安装环境:CentOS-6.3安装方式:源码编译安装软件名称:mysql ...
- FIREDAC驱动MYSQL数据库
FIREDAC驱动MYSQL数据库 FIREDAC连接MYSQL数据库需要用到LIBMYSQL.DLL这个动态库. 这个LIBMYSQL.DLL分为32位和64位两个不同的版本,对应32位或64位的M ...
- Camera setParameters(), getParameters(),unlock()三个方法之间的限制关系
Camera mCamera = Camera.open(); // 第一次调用getParameters()需要在unlock()方法之前否则出现错误 Camera.Parameters param ...