加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 22:22:52 所属栏目:大数据 来源:网络整理
导读:关于Lua的闭包的用法。 动态语言闭包是一大特色,但是知道如何产生一个闭包,不知道闭包如何来使用就会变成一个非常尴尬的问题。前几天突然想明白了。跟大家说说。有其他好的理解也欢迎来和俺讨论切磋。 ? for?i in iter() do ?? print(i) end ? 这是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的值 这就是闭包的优雅之处,如果不然,我们就需要把很多的++放到外面来书写.这样使用闭包对于写代码的人会累,但是对于看代码的人会更加的直观,这种清新的表达方式就是闭包这个语法特性的好处.他可以隐藏一些规则然后通过重复的调用来解决问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读