Cocos2d-Lua之闭包

对于function中定义的local变量只能活在这个function中,出了这个function就不存在了。

function bag(a)
    local x = a
    x = x + 1
    print(x)
end

for i = 1, 10 do
    bag(3)
    bag(10)
    print("-----------------")
end

输出结果:

这里写图片描述

这样的输出是理所当然的。

如果应用闭包,也就是说在一个函数中再嵌套一个函数,并返回被嵌套的函数,就会让外层函数的local变量的声明周期得到扩展,这跟C/C++中的函数中的static变量很类似,但又不同,先看个例子:


--Lua语言
function bag(a)
    local x = a
    function ff()
        x = x + 1
        print(x)
    end
    return ff
end

local fun1 = bag(3)
local fun2 = bag(10)
for i = 1, 10 do
    fun1()
    fun2()
    print("-----------------")
end

输出结果:

这里写图片描述

可以看到bag函数中的local变量x的声明周期得到了扩展,保留了上次的值,并且对于两个bag赋予不同的初值进行同步工作,互相是不干扰的。就像同一个枪口发射多颗子弹,他们的运动轨迹相互是不被干扰的,所以闭包在这方面的游戏开发应用是非常广泛的。

再与C++的函数中的static变量比较一下:

void func(int a) {
    static int x = a;
    x++;
    cout << x << endl;
}

int main() {
    for (int i = 0; i < 10; i++) {
        func(3);
        func(10);
        cout << "----------------------" << endl;
    }
    system("pause");
    return 0;
}

输出结果:

这里写图片描述

可以看到函数内部的变量的生命周期同样得到了扩展,可以两个函数传入不同的参数进行工作时,第二个参数传入的值完全被忽略了,所以static是相互干扰的,这是不同于Lua闭包的重要特征。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值