lua闭包函数

**

闭包函数

**
概念
通过调用含有一个内部函数加上该外部函数持有的外部局部变量(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值