© 版权声明:本文为博主原创文章,转载请注明出处

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迭代器的更多相关文章

  1. Lua学习---编译生成lua和luac

    众所周知,Lua是一种强大的脚本语言,并且这种语言是用C语言实现的.为什么要学习这门语言?因为它可以增强我看C语言代码的功底. 我下的Lua版本是Lua5.3,关于Lua5.3的简介如下: http: ...

  2. Lua学习2 Lua小框架的搭建

    看了上一篇Lua环境搭建具体http://blog.csdn.net/liuwumiyuhuiping/article/details/9196435 为了方便学习. 具体新开始搭建一下学习的小框架. ...

  3. Lua学习五----------Lua循环

    © 版权声明:本文为博主原创文章,转载请注明出处 1.循环类型 1.1 while循环 - 语法:while(condition) do ...<执行语句> end - 解析:判断cond ...

  4. lua学习:lua中“类”的实现

    在之前的面试遇到考用lua实现类的题目.现在就补补这块知识点. 我们都知道Lua中的table是一个对象.拥有状态,拥有self,拥有独立于创建者和创建地的生命周期. 一个类就是一个创建对象的模具.L ...

  5. Lua学习十----------Lua数组

    © 版权声明:本文为博主原创文章,转载请注明出处 1.LUA数组 - 一维数组 - 多维数组 2.array.lua -- 一维数组 print("一维数组") array1 = ...

  6. Lua学习九----------Lua字符串

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...

  7. Lua学习八----------Lua运算符

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua运算符: - 算术运算符:+(加法).-(减法).*(乘法)./(除法-取整).%(除法-取余).^(乘幂).-(负号) - 关系运算符:= ...

  8. Lua学习七----------Lua函数

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua函数 - 完成指定的任务,这种情况下函数作为调用语句使用 - 计算并返回值,这种情况下函数作为赋值语句的表达式使用 - Lua函数可以返回多 ...

  9. Lua学习六----------Lua流程控制

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua流程控制 - 通过程序设定一个或多个条件语句 - 在条件为true时执行指定程序代码,在条件为false时指定其他指定程序代码 - 控制结构语句 ...

随机推荐

  1. HDU 4251 The Famous ICPC Team Again(划分树)

    The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  2. 分析dump

    一.使用jmap工具生成dump文件 二.MAT工具的下载和安装 三.使用MAT工具进行内存泄露分析  -- Step 1 :  ps –ef | grep <process> (whic ...

  3. 【bzoj1087】【互不侵犯King】状压dp裸题(浅尝ACM-D)

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54329606 向大(hei)佬(e)势力学(di ...

  4. jsp笔记3(内置对象)

    jsp脚本中的9个内置对象: 1.application:javax.servlet.ServletContext的实例对象,该实例对象代表jsp所属的web应用本身,可用于在jsp页面或Servle ...

  5. xml文件生成与下载

    写在前面: 最近要做一个新的功能,点击按钮,可以根据数据生成对应的xml文件并保存.下面记录一下在做的过程的一些疑惑与问题(我就是太笨了,一些很简单的知识都不知道,不过通过这次跟蛋蛋的交流,解决了我的 ...

  6. JSP(待更新)

    1.概念: 所谓JSP就是在HTML中嵌入大量的java代码而已.

  7. IOS设置UIView的边框为圆角

    iOS 系统自带的 View 组件都是正方形的,看起来都太生硬,有时候我需要变成圆角形式,如下图:    具体的实现是使用QuartzCore库,下面我具体的描述一下实现过程:    •    首先 ...

  8. 129 - Krypton Factor

    /*UVa129 - Krypton Factor --回溯问题.看例子可知道确定该字符串是按照从左到右依次考虑每个位置,当前位置填不上所有的字符时,需要回溯. -- */ #define _CRT_ ...

  9. 《Linux性能及调优指南》----1.1 Linux进程管理

    翻译:飞哥 ( http://hi.baidu.com/imlidapeng ) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance ...

  10. [转载]Redis后台启动

    FROM: http://www.art-coder.com/2011/12/01/how-to-run-redis-server-as-daemon/ How to run Redis server ...