**
闭包函数
**
概念
通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数
闭包组成
外部函数+外部函数创建的upvalue+内部函数(闭包函数)
function test()
local Test=0
return function()--//尾调用
Test =Test + 1
return Test
end
end
c1=test()
c2=test()--//c1,c2是建立在同一个函数,同一个局部变量的不同实例上面的两个不同的闭包
--//闭包中的upvalue各自独立,调用一次test()就会产生一个新的闭包
print(c1()) -->1
print(c1()) -->2//重复调用时每一个调用都会记住上一次调用后的值,就是说i=1了已经
print(c2()) -->1//闭包不同所以upvalue不同
print(c2()) -->2
闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量。每次闭包的成功调用后这些外部局部变量都保存他们的值(状态)。当然如果要创建一个闭包必须要创建其外部局部变量。所以一个典型的闭包的结构包含两个函数:一个是闭包自己;另一个是工厂(创建闭包的函数)。迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里。闭包提供的机制可以很容易实现这个任务。
注意:
1.形成的闭包是引用类型的
2.upvalue: 是内嵌函数可以访问外包函数已经创建的所有局部变量,这些局部变量称为该内嵌函数的外部局部变量(external local variable)或者upvalue,upvalue实际指的是变量而不是值。
闭包函数代码案例:
function list_iter(t)
local i=0
local n=table.getn(t)
print("6666")
return function()
i = i+1
if i<=n
then
return t[i]
end
end
end
--这里的list_iter是一个工厂,每次调用都会产生一个新的闭包该闭包内部包括了
-- upvalue(t,i,n)
--因此每调用一次该函数产生的闭包那么该闭包就会根据记录上一次的状态,以及
--返回list的下一个
t={10,20,90}
iter=list_iter(t)--1/调用迭代器产生一个闭包
while
true do
local element=iter()
if element==nil then
break
end
print(element)
end
t={10,0,29}
for element in list_iter(t)do--//这里的list_iter)工厂函数只会被调用一次产生 一个闭包函数,后面的每—次迭代都是用该闭包函数,而不是工厂函数
print(element)
end