lua闭包与简易迭代器实现
1、什么是闭包
function Counter() local i=0 return function() i++ ... end end --这里就是闭包,Counter()就是外部函数,它的返回值就一个内部函数, --这里的i也叫外部局部变量,就是lua中的upvalue
2、举个闭包栗子
function closureTest() local a=0 return function() a=a+10 return a end end ct1=closureTest() print(ct1()) --10 print(ct1()) --20 ct2=closureTest() print(ct2()) --10
在这个例子中,lua会以closure的方式来处理这种情况,ct1和ct2是建立在同一个函数的两个不同闭包,每调用一次closureTest函数就会产生一个新的闭包 ,闭包中的upvalue各自独立,他们各自拥有局部变量a的实例。第一次打印ct1()时输出的是10,第二次打印ct1()时,由于是同一个闭包,重复调用ct1()时已经记住了上次调用后的值,因此输出20,而ct2()是另一个闭包,所以输出的是10。
3、迭代器与闭包
function listTest (t) local i = 0 local n = table.getn(t) --得到table的大小 return function () i = i + 1 if i <= n then return t[i] end end end
在这个迭代器例子中,每次调用listTest(),都能返回当前遍历到的位置的值,外部局部变量i保存的就是当前位置。