Lua 闭包


--闭包
--一个函数中嵌套子函数,子函数可以使用父函数中的局部变量,这种行为就是“闭包"。

--闭包的特点:闭包中的内嵌函数可以访问外部函数已经创建的所有局部变量,这些变量
--			称为该内嵌函数的 “upvalue” 。
--从栈顶取一个变量,和函数关联到一起,做成一个闭包
--若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为“词法域”。
--外部函数中的局部变量在匿名函数内既不是全局变量,也不是局部变量,将其称之为“非全局变量”。



--eg1: 无参数闭包
function Fun()
    local i=0           --i 变量 ,称为内嵌函数的 "upValue" 。 这里的i 变量即不是全局变量,也不是局部变量。
                        -- 这里应该称为“非局部变量”

    return function()   --内部嵌入的匿名函数,
        i=i+1
        return i
    end
end
----调用测试

f1=Fun()      -- 返回一个闭包(上值关联到函数的内嵌函数)
print(f1())   --结果 1
print(f1())   --结果 2
print(f1())   --结果 3
print(f1())   --结果 4
f1=Fun() 
print(f1())    --结果 1
----------


--eg2: 带参数的闭包
function FunWithPara(i)     --参数i ,是内嵌函数的“upValues”
    print("A/ i=",i)
    return function()       --内嵌匿名函数
        print("B/ i=",i)
        i=i+1
        print("C/ i=",i)
        return i
    end
end

fun2=FunWithPara(10)
print(fun2())
print(fun2())
print(fun2())
print(fun2())




--eg3: 具备多个内嵌函数的闭包
--     本示例中,两个内嵌函数,对upVluaes 数值进行共享处理。
function FunMutil()
    local numUpValue=10     --这是"up Values"

    function InnerFun1()    --内嵌函数
        print(numUpValue)
    end

    function InnerFun2()
        numUpValue=numUpValue+100
    end

    return InnerFun1,InnerFun2
end

--调用测试
local res1,res2=FunMutil()
res1()              --output: 10
res2()              --output:
res1()              --output: 110


--eg5: 演示闭包可以具备多个实例。
function Fun5()
    local i=0

    return function()
        i=i+1
        return i
    end
end

--测试调用
res51=Fun5()
print(res51())     --output: 1
print(res51())     --output: 2
print(res51())     --output: 3

res52=Fun5()
print(res52())     --output: 1
print(res52())     --output: 2
print(res52())     --output: 3
print(res52())     --output: 4



--eg6: 使用闭包技术开发自己的“迭代器”

--自定义“迭代器”(闭包)
function Itrs(tabArray)
    local  i=0

    return function()
        i=i+1
       return tabArray[i]
    end
end

----定义一个表
myTab={10,20,30,55,60,75,88,99,100}
--迭代输出
iterator=Itrs(myTab)
--使用while 输出
while(true) do
    local j=iterator()
    if(j==nil) then
        break
    end
    print("(while) j=",j)
end

--使用For 输出
for m in Itrs(myTab) do
    print("(for): ",m)
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值