举例说明关于 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的值 这就是闭包的优雅之处,如果不然,我们就需要把很多的++放到外面来书写.这样使用闭包对于写代码的人会累,但是对于看代码的人会更加的直观,这种清新的表达方式就是闭包这个语法特性的好处.他可以隐藏一些规则然后通过重复的调用解决问题.

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...