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

 更新时间:2014年09月27日 16:26:20   作者:Mr.Ant  
这篇文章主要介绍了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变量。

相关文章

  • 使用lua实现php的var_dump()函数功能

    使用lua实现php的var_dump()函数功能

    小编比较熟悉php,所以这篇文章主要介绍了使用lua实现php的var_dump()函数功能,需要的朋友可以参考下
    2014-11-11
  • Lua利用cjson读写json示例分享

    Lua利用cjson读写json示例分享

    本文结合本人的实际使用经验和代码示例,介绍如何在Lua中对json进行encode和decode,需要的朋友可以参考下
    2014-11-11
  • Lua与C语言间的交互实例

    Lua与C语言间的交互实例

    这篇文章主要介绍了Lua与C语言间的交互实例,本文主要讲解了Lua中调用C语言的方法和例子,需要的朋友可以参考下
    2014-12-12
  • Lua中的迭代器浅析

    Lua中的迭代器浅析

    这篇文章主要介绍了Lua中的迭代器浅析,本文先是讲解了什么是迭代器,然后给出了自己写一个迭代器的示例,最后介绍了迭代器的调用方法,需要的朋友可以参考下
    2014-09-09
  • Lua中使用模块的一些基础知识

    Lua中使用模块的一些基础知识

    这篇文章主要介绍了Lua中使用模块的一些基础知识,说明基本上都融入注释之中,需要的朋友可以参考下
    2015-07-07
  • Lua教程(十): 全局变量和非全局的环境

    Lua教程(十): 全局变量和非全局的环境

    这篇文章主要介绍了Lua教程(十): 全局变量和非全局的环境,本文讲解了老的全局变量环境和Lua5中新的非全局环境相关知识,需要的朋友可以参考下
    2015-04-04
  • 使用Lua作为C语言项目的配置文件实例

    使用Lua作为C语言项目的配置文件实例

    这篇文章主要介绍了使用Lua作为C语言项目的配置文件实例,本文用Lua创建了一个配置文件,然后在C言语中解析它,需要的朋友可以参考下
    2015-04-04
  • Lua中的迭代器和泛型for实例

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

    这篇文章主要介绍了Lua中的迭代器和泛型for实例,本文还讲解了无状态迭代器,需要的朋友可以参考下
    2014-09-09
  • Lua中的__index方法详解

    Lua中的__index方法详解

    这篇文章主要介绍了Lua中的__index方法详解,本文详细讲解了__index方法的相关知识,以及代码示例,需要的朋友可以参考下
    2015-04-04
  • Lua极简入门指南(六):模块

    Lua极简入门指南(六):模块

    这篇文章主要介绍了Lua极简入门指南(六):模块,本文讲解了require函数、编写模块、查找模块等内容,需要的朋友可以参考下
    2014-10-10

最新评论