举例说明关于 Lua闭包 的存在价值

关于Lua的闭包的用法。

动态语言闭包是一大特色,但是知道如何产生一个闭包,不知道闭包如何来使用就会变成一个非常尴尬的问题。前几天突然想明白了。跟大家说说。有其他好的理解也欢迎来和俺讨论切磋。

 

for i in iter() do

   print(i)

end

 

这是Lua的泛型for的一个伪代码。Lua提供了一些迭代器比如 pairs()这个东西。问题这个迭代器是如何写的呢?我们把for拆开来看iter会一直被调用 直到iter返回 nil为止。所以说 iter这个函数是一直被调用的。想想写法很容易想到闭包的特性。

 

让我们回顾一下闭包。

 

function iter()

    local a = 0

    return function()

        a = a + 1   

    end

end

 

上面就是一个闭包的写法。当我们调用iter的时候我们可以 fun = iter() 然后通过 fun()来调用 内部的闭包.这个时候a会一直递增下去.很多人一定很闷 为啥? 因为lua的语句块的关系,当我们 fun = iter() 的时候 fucntion()会被 return 这时候我们的 a就是一个闭包的变量,这个 环境会被 重复调用 a这个 valueup就会被一直加下去.所以解释了 为啥 a为什么会一直加下去.这是一个神奇的事情,当然这个神奇的现象会给我带来很多便利.让代码更加的工整.

 

现在我们想遍历一个 数组

 

tab[] = {1,2,3,4,5,6,7,8}

 

我们就可以使用闭包来定义一个迭代器来使用.

 

function iter()

    local index = 0

    return function()

        index = index + 1 

        return tab[index]

    end

end

 

之后我们就可以使用这个迭代器来遍历整个tab

 

for i in iter() do

   print(i)

end

 

结果:

 

1

2

3

4

5

6

7

8

 

好处究竟在哪里呢?可以看到 iter()这个函数 我们通过 fun=iter()可以拿到一个闭包函数,之后调用循环调用 fun就可以得到所有的tab的值 这就是闭包的优雅之处,如果不然,我们就需要把很多的++放到外面来书写.这样使用闭包对于写代码的人会累,但是对于看代码的人会更加的直观,这种清新的表达方式就是闭包这个语法特性的好处.他可以隐藏一些规则然后通过重复的调用来解决问题.

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值