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

  1. Lua中的迭代器与泛型for

    [前言] 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道 ...

  2. Lua迭代器和泛型for

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

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

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

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

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

  5. Lua学习笔记一

    学习了有一周多了.之前一直不想献丑,但还是记录下这个过程. 第1章  开发软件搭建 1. ubuntu 下lua安装 sudo apt-get install lua5.1 2.win下的环境搭建. ...

  6. Lua学习高级篇

    Lua学习高级篇 之前已经说了很多,我目前的观点还是那样,在嵌入式脚本中,Lua是最优秀.最高效的,如果您有不同的观点,欢迎指正并讨论,切勿吐槽.这个系列完全来自于<Programming in ...

  7. Lua 学习笔记(二)

    七.再论lua函数 1.lua中的函数被认为是带有词法定界和第一类值    a.词法定界:被嵌套的函数可以访问外部函数的变量    b.第一类值: lua中的函数可以放在变量中    (函数指针?) ...

  8. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  9. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

随机推荐

  1. 在my.ini文件中配置mysql统一字符集

    测试的mysql版本为:5.7.14 查看mysql字符集命令: show variables like 'character_set_%'; 以下是在my.ini文件中配置mysql统一字符集参数: ...

  2. idea + mybatis generator + maven 插件使用

    idea + mybatis generator + maven 插件使用 采用的是 generator 的 maven 插件的方式 ~ 1 pom.xml mybatis其它配置一样,下面是配置my ...

  3. ConcurrentHashMap总结

    线程不安全的HashMap 因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap,如以下代码   final HashM ...

  4. 配置WampServer以及搭建WordPress的一些问题,持续总结。

    这里用的版本是Wampserver2.4-x64. Wamp的安装就不赘述了,一路点通过就可以了. #注意:(最好别改,省的麻烦) 80端口是Apache 的默认端口,在httpd.conf文件中配置 ...

  5. 使用NPOI生成Excel级联列表

    目录 1    概要    1 2    磨刀不误砍柴工——先学会Excel中的操作    2 3    利用NPOI生成导入模板    7 3.1    设置workbook&sheet   ...

  6. webpack 打包成功,但是css不起作用

    问题: webpack 打包成功,但是css不起作用 问题分析/解决: 原因有以下几种 使用了webpack2的语法规则不正确; webpack2要求必须写-loader; 可能是只写了css-loa ...

  7. contos 7/redhat 7 安装mysql

    1.给网卡配置ip.掩码.网关   2.添加dns,编辑文件:/etc/resolve.conf nameserver 202.96.209.133       //上海本地dns nameserve ...

  8. 前端魔法堂:解秘FOUC

    前言  对于问题多多的IE678,FOUC(flash of unstyled content)--浏览器样式闪烁是一个不可忽视的话题,但对于ever green的浏览器就不用理会了吗?下面尝试较全面 ...

  9. AngularJS创建新指令 - 函数功能

    首先先介绍下AngularJS指令下的几种函数 Link函数和Scope 指令生成出的模板其实没有太多意义,除非它在特定的scope下编译.默认情况下,指令并不会创建新的子scope.更多的,它使用父 ...

  10. stl_组件

    2.1.STL中: 2.1.1.包含常用的数据结构. 2.1.2.包含常用的基本算法.结构和算法其实就是一些接口. 2.1.3.提供了一套可扩展的框架. 2.2.六大组件: 2.2.1.容器组件(基本 ...