Lua中的迭代器和泛型for实例

1、迭代器与closure

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

代码如下:

function values(t)
    local i=0
    return function() --匿名函数
    i=i+1
    return t[i]
    end
end

t1 ={10, 20, 30}
it=values(t1)   --创建闭包变量的参数为函数参数
while true do
    local element=it()      --调用闭包时的参数为匿名函数的参数
    if(element==nil) then break
    end
    print(element)
end

t2={11,22,33}
for v in values(t2) do
   print(v)
end
--输出结果
--10
--20
--30
--11
--22
--33

从上面的例子可以看出,范型for相对于while给我们提供了更为清晰的实现逻辑。luo的内部函数已经为我们提供了迭代函数,运行foreach时我们会调用隐式的迭代器。

2、泛型for的语义

上面的迭代器有一个明显的缺点,就是每次循环时都要创建一个新的closure变量,而不能运用之前已经创建好了的closure变量,如果我在这个循环外再加一个循环进行迭代时,这就成了一个很繁琐并且容易出错的问题。

下面出现的迭代器很好的解决了这个问题,就不必为每次的泛型for都创建一个新的closure变量了。

代码如下:

function iter(a,i)
   i=i+1
   if a[i]==nil then return nil,nil
   else return i,a[i]
   end
end

function ipairs(a)
   return iter,a,0         --iter在这里只是一个函数变量,并不是调用函数
end

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

--上面的泛型for的写法可以改为下面的while写法
do
    local _it,_s,_k=ipairs(a)
    while true do
       k,v=_it(_s,_k)
       _k=k
       if k==nil then break end
       print(k,v)
    end
end
--输出结果
--1 one
--2 two
--3 three
--1 one
--2 two
--3 three

3、无状态迭代器

代码如下:

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={next=list, value=line}
end

for node in traverse(list) do
    print(node.value)
end
--输入
--a
--b
--c
--输出
--c
--b
--a

通过上面的例子可以看出,可以无限次运用list变量和调用traverse函数而不必像第一种情况那样每次循环之前都创建新的closure变量。

(0)

相关推荐

  • 浅析Lua中的迭代器

    迭代器是一种结构,使能够遍历所谓的集合或容器中的元素.在Lua中,这些集合通常是指那些用于创建各种数据结构,如数组表. 一般对于迭代器 一个通用的迭代器提供的键值对集合中的每个元素.下面一个简单的实例. 复制代码 代码如下: array = {"Lua", "Tutorial"} for key,value in ipairs(array) do    print(key, value) end 当我们运行上面的代码之后将得到下面的输出 复制代码 代码如下: 1 

  • Lua教程(五):迭代器和泛型for

    1. 迭代器与Closure: 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的"下一个"元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍历时的位置.从这一点看,Lua中closure机制为此问题提供了语言上的保障,见如下示例: 复制代码 代码如下: function values(t)     local i = 0     return function()         i = i + 1         return t[i

  • Lua的迭代器使用中应该避免的问题和技巧

    关于迭代器的内容,还有一点点,不过已经无关紧要了,应该算是一种扩展吧,就一起来开开眼界好了~ 1.避免创建闭合函数 我们之前一直在说的迭代器,都是要创建闭合函数,但,大家有没有想过,有了恒定状态和控制变量之后,是不是就不需要闭合函数了? 先来回顾一下之前的迭代器函数: 复制代码 代码如下: function dieDaiQi(t)     local i = 0;     return function(s, var)         i = i + 1;                 if

  • Lua中的for循环和迭代器的秘密探究

    上一篇我们介绍了,可以使用for循环来完成迭代器的调用,十分简洁. 那么,具体这for循环做了什么呢?我当然没有去看源码,我只是看书而已. 资料来源于<Lua程序设计>第二版,如果这本书的内容没有错的话,那么,本篇文章理论上也不会有错~ 1.返回两个值的迭代器 pairs是能遍历table的key和value的,而我们之前写的dieDaiQi函数只能返回value. 所以,我们要改改dieDaiQi函数,如下: 复制代码 代码如下: function dieDaiQi(t)     local

  • Lua中的迭代器和泛型for学习总结

    前言 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的"下一个"元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道它所在的位置及如何走到下一个位置,通过之前博文的总结,闭包对于这样的任务提供了极佳的支持.现在我们就用代码来实现一个简单的迭代器. 复制代码 代码如下: function values(tb)      local i = 0      return function ()          

  • 深入解读Lua中迭代器与泛型for的使用

    泛型for原理 迭代器是一种可以遍历集合中所有元素的机制,在Lua中通常将迭代器表示为函数,每调用一次函数,就返回集合中"下一个"元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何步进到下一个位置,closure就可以完成此项工作.下面的示例是列表的一个简单的迭代器: function values(t) local i = 0 return function() i = i + 1; return t[i] end end 循环调用: t = {10

  • Lua中的迭代器(iterator)浅析

    Lua有迭代器的概念,通过不同的迭代器,几乎可以遍历所有的东西.标准库提供的几种迭代器:io.lines(迭代文件中的每行), pairs(迭代table元素),ipairs(迭代数组元素), string.gmatch(迭代字符串中单词)等. 另外,可以自定义迭代器 使用pairs迭代器变量table 复制代码 代码如下: > t = {2,3,4,5} > for i,v in pairs(t) do >> print(i .. ' = ' .. v) >> end

  • Lua中的迭代器和泛型for介绍

    任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器.lua中常常使用函数来描述迭代器,每次调用该函数都返回集合的下一个元素.每一个迭代器都需要保存一些状态来知道当前处于什么位置和如何进行下一次迭代.对于这样的任务,闭包提供了很好的机制来完成.一个典型的闭包结构包含两个函数:一个是闭包自身,一个是创建闭包的工厂. 例如,我们可以写过简单的list迭代器,让他仅仅返回值. 复制代码 代码如下: function values( t )      local i = 0;      retu

  • Lua中的迭代器浅析

    今天学习的内容还蛮有意思的,让我兴奋了一下~ 1.迭代器 什么是迭代器?别傻了,我最讨厌的就是名词解释了,反正就是用来遍历集合的一种方式. 比如,我们最常用的pairs,如下代码: 复制代码 代码如下: local t = {"fdsd", "445"};        for k, v in pairs(t) do         print("k=" .. k .. ", v=" .. v);     end 这是一次遍历

  • Lua中的迭代器和泛型for实例

    1.迭代器与closure 在lua中,迭代器通常为函数,每调用一次函数,会返回集合中的下一个元素.每个迭代器在成功调用的时候,都需要保存一些状态,closure(闭包)完美为迭代器运用而生. 复制代码 代码如下: function values(t)     local i=0     return function() --匿名函数     i=i+1     return t[i]     end end t1 ={10, 20, 30} it=values(t1)   --创建闭包变量的

  • Lua中的一些常用函数库实例讲解

    前言 这篇文章将会来一些比较轻松的内容,就是简单的介绍一下Lua中几个常用的库.简单的说就是几个API的介绍.所以说,看起来比较容易,也没有多大的分量.就是纯粹的总结.使用库就是为了方便我们的开发,提高开发效率,同时也能保证代码的质量.希望大家以后也不要重复造轮子了. 数学库 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan--) 所有的三角函数都使用弧度单位,可以用函数deg(角度)和rad(弧度)来转换角度

  • Lua中的动态链接实例

    C语言应用程序中经常使用动态链接机制集成各个模块:不过,动态链接机制并不是ANSI C标准的一部分,也就是说实现方法是不可以移植的. Lua通常不会包含任何无法通过ANSI C来实现的机制,如果动态链接是一个例外.Lua打破了对可移植性的准则,为几种平台实现了一套动态链接机制. package.loadlib是动态链接功能的核心函数,接收两个参数:动态库的完整路径名.函数名称. loadlib函数加载指定的库,并将其链接入Lua:如你所想,并不会调用库中的任何函数,而是将一个C函数作为Lua函数

随机推荐