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时指定其他指定程序代码 - 控制结构语句 ...
随机推荐
- 【原创】Oracle 11g R2 Client安装配置说明(多图详解)
1. 准备工作 安装Oracle11gR2client的时候,如果刚从网上下载的Oracle client,可能无法再2008 R2或者2012 R2的服务器上面运行. 报错:[INS-13001]环 ...
- Laravel实现用户名或密码登录
要实现用户名或密码登录,这就要用到强大的filter_var函数 该函数通过指定的过滤器过滤变量,可以判断输入值是否是数字.是否是字符串.是否是邮箱.是否是IP等等,不用写麻烦的正则 $type = ...
- 如何让springboot中的某些html文件不经过thymeleaf模板解析?
这个thymeleaf有时有用,有时用不着. 但默认设置,所有的html都会经过它解析. 我的作法,是新建public,在resource里,所有css,js所放里面.(当然,static下也是OK的 ...
- HTML5面向对象的游戏开发简单实例总结
在阅读一本HTML5游戏开发相关书籍时发现一个很好的例子,通过这个例子可以对面向对象的开发进行更深入的理解.这个对象要实现的是:将一个CSS sprite中的图像绘制到canvas中.首先创建一个Sp ...
- HDU 6113 度度熊的01世界【DFS/Flood Fill】
度度熊的01世界 Accepts: 967 Submissions: 3064 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- HNOI2004 郁闷的出纳员(Splay)
郁闷的出纳员 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的 ...
- DQL数据查询语言——连接查询
--内连接 两种写法 等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b.b ...
- 单条sql性能分析与优化
性能分析 1. explain 查看sql执行计划,得出索引使用情况等信息 2. show profiling 查看sql所有执行步骤以及用时,使用步骤如下 1)开启性能剖析 mysql> se ...
- sourceinsight tab 空格 对齐 等宽字体
参考:http://bbs.chinaunix.net/thread-587409-1-1.html 1. SMART TAB的用法. 解决自动缩进. 新开一个PROJECT后,点Options-&g ...
- 咏南下拉列表数据敏感控件--TYNDBSearch
咏南下拉列表数据敏感控件--TYNDBSearch 拥有下拉列表控件可以大大地加速软件系统的开发. 控件适用于DELPHI5及以上版本安装并使用. 控件的用法: procedure Tfgoods.s ...