lua学习笔记day04-----泛型for和迭代器

迭代器是一种指针类型的结构,它可以遍历集合的每一个元素。在lua中我们常常用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。

从原文对迭代器的描述来看,迭代器应该包含两个部分:

1、迭代过程的描述,这个是由函数完成

2、每次调用,显然是一个循环的结构,既然是个循环结构,且没有特指泛型for,就表明,用其他循环语句也是可以完成迭代器。


那么迭代器,泛型for就是两个东西。

迭代器可以不由泛型for和闭包组成。

高效的迭代器可以由泛型for和闭包来实现。


首先,我创建一个使用while循环且不带闭包的迭代器,不建议使用这样的迭代器,创建麻烦。 

a = {"one","two","three"}
n = 3
i = 0
function dd(c,k)
        if k <= n then
                k = k + 1
                return c[k],k
        end

                return nil
end

function gc()
        return dd
end

do
p = gc()
while true do
        b ,i= p(a,i)
        if b then
                print(b)
        else break end
end
end


上述代码,用gc返回一个dd的迭代函数给p。这样p就是一个迭代函数,通过while循环实现对a集合的遍历。

这while和p就组成了一个迭代器。

在这个例子里,没有用到泛型for和闭包,这个例子仅仅为了解释迭代、泛型for和闭包,不是存在必要的联系。


现在将闭包的思想加入到上述的例子中,

闭包是可以记录upvalue(外部的局部变量)的状态的。

a = {"one","two","three"}

function gc(c)
        local k = 0
        return function ()
                k = k + 1
                if c[k] then
                        return c[k],k
                end
                        return nil
                end
end

do
p = gc(a)
while true do
        b = p()
        if b then
                print(b)
        else break end
end
end

通过闭包的思想,可以将多余的全局变量省去。省去一个函数名。

现在再将泛型for加入到上述例子中
a = {"one","two","three"}

function gc(c)
        local k = 0
        return function ()
                k = k + 1
                if c[k] then
                        return c[k],k
                end
                        return nil
                end
end

for b in gc(a) do
        print(b)
end
循环的过程被泛型for替代,让整个过程看起来非常的简单。

这就是闭包和泛型for组合生成的高效迭代器。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值