文档章节

Lua 笔记--迭代器与泛型for

_子墨
 _子墨
发布于 2014/12/27 19:40
字数 725
阅读 58
收藏 0

        所谓“迭代器”就是一种可以遍历一种集合中所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的“下一个”元素。

function values(t)
    local i = 0
    return function() 
                i = i + 1
           return t[i]
           end
end

        在上例中,values就是一个工厂。每当调用这个工厂时,它就创建一个新的closure(即迭代器本身)。这closure 将它的状态保存在其外部变量t 和i 中。每当调用这个迭代器时,它就从列表t 中返回下一个值。直到最后一个元素返回后,迭代器就会返回nil,以此表示迭代的结束。

        泛型for语法:

for <var-list> in <exp-list> do
    <body>
end

  其中,<var-list>是一个或多个变量名的列表,以逗号分隔;<exp-list>是一个或多个表达式的列表,同样以逗号分隔。通常表达式只有一个元素,即一句对迭代器工厂的调用。for 做的第一件事是对in 后面的表达式求值。

 简单示例:

function values(t)
    local i = 0
    return function()
                i = i + 1
            return t[i]
            end
end
t = {1, 2, 3}
for element in values(t) do
    print(element)
end

        “无状态的迭代器”就是一种自身不保存任何状态的迭代器。因此,我们可以在多个循环中使用同一个无状态的迭代器,避免创建新的closure 开销。

        在每次迭代中,for循环都会用恒定状态和控制变量来调用迭代器函数。一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素。这类迭代器的一个典型例子就是ipairs,它可以用来迭代一个数组的所有元素:

a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print(i, v)
end

        函数pairs 与ipairs 类似,也是用于遍历一个table中的所有元素。不同的是,它的迭代函数是Lua中的一个基本函数next。

function pairs(t)
    return next, t, nil
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 = nil
for line in io.lines() do
    list = {val = line, next = list}
end

for node in traverse(list) do
    print(node.val)
end

        文件操作:

--读取文件,显示文件内容
local f = assert(io.open("test2.lua", 'r'))        --相当于获取流的指针或句柄或对象
--'r'读取(read),'a'追加(append),'w'写入(write),'b'以二进制形式打开(binary)

local string = f:read("*all")        
--*all读取所有,*line读取一行,*number读取一个数字,<num>读取一个不超过<num>个数的字符

f:close()        --关闭流    
print(string)

--写入文件
local f = assert(io.open("test2.txt", 'w'))
f:write("welcome to lua \n I'm Jacedy")
f:close()


© 著作权归作者所有

_子墨
粉丝 48
博文 157
码字总数 141425
作品 0
深圳
iOS工程师
私信 提问
Lua 学习笔记(2) 类型与值、表达式、语句、迭代器、泛型for

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l773575310/article/details/82715966 Lua 学习笔记(2) 类型与值、表达式、语句 参考书籍: 《Lua程序设计》...

ChiLi_Lin
2018/09/15
0
0
Openresty最佳案例 | 第2篇:Lua入门

转载请标明出处: http://blog.csdn.net/forezp/article/details/78616622 本文出自方志朋的博客 什么是lua Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的...

forezp
2017/11/23
0
0
Lua程序设计 泛型for的定义

泛型for在循环过程内部保存了迭代器函数。实际上他保存着3个值:一个迭代器函数、一个恒定状态和一个控制变量。 泛型for的语法如下: for <var-list> in <exp-list> do end 其中,<var-list...

80后小子
2014/07/29
562
0
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)

(本文示例工程源代码下载地址:http://down.51cto.com/data/1975295) 在上一篇博文的最后,介绍了使用@PostConstruct注解标注StudentDao的init方法,这样在Spring完成依赖注入后此方法即会...

NashMaster2011
2015/01/14
0
0
一种C#泛型方法在lua中表示的设计

  在进行lua方法注册的时候, 大多数解决方案直接否定了泛型方法, 因为在lua侧难以表达出泛型, 以及lua的函数重载问题, 函数重载问题可以通过一些特殊方法解决, 而泛型问题是主要问题, 以U...

tiancaiKG
03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布《2019 中国 Java 发展趋势报告》,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有...

阿里云官方博客
9分钟前
2
0
Spring Boot 2.x基础教程:Swagger静态文档的生成

前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了。如果您还不熟悉这块,可以先阅读: Spring Boot 2.x基础教程...

程序猿DD
13分钟前
2
0
《毅力》读书笔记

1.确信你全身心地投入 2.准备好为目标进行艰难的跋涉 3.通过减少需要使用毅力的情形,为将来的挑战做好准备 4.尽可能具体细致地确定你的目标和实现目标的过程 5.把挑战分解为小而易于管理的小...

lingch
14分钟前
3
0
zk中快速选举FastLeaderElection实现

选举涉及概念 服务器状态 投票 如何选择投票? 协议 选举 如何进行选举? epoch 发送者 接收者 发送队列 接收队列 服务器状态 public enum ServerState { LOOKING,寻找Leader状态,当服务处于...

writeademo
17分钟前
2
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

Linux就该这么学
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部