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