lua闭包

lua语言有如下两个特点:

1.lua中的函数可以被存放在变量、表中,也可以作为函数的参数,还可以作为函数的返回值,如:

func = function()
    print("Hello");
end

等价于

function func()
    print("Hello");
end 
这两种写法都是函数func()的定义;并且下面这个例子:
function func()
    return function()  
        print("Hello");  
    end  --函数作为返回值
end

local f1 = func();
print(f1);  --运行结果:function:00379738
f1();      --运行结果:Hello

函数作为函数返回值的情况,其中f1是func()内部返回的函数,打印出来为函数在内存中的地址,f1()调用了内部函数,执行后打印出了"Hello"结果。


2.被嵌套的函数可以访问他外部函数中的变量(这个比较强悍,C语言只能访问全局的或以参数形式传入)。
看如下例子:
function func()
    local index = 0;        
    local inner = function()
        print(index);      
        index = index + 1;
    end
    inner();            --打印结果:0
    inner();            --打印结果:1
    print(index);         --打印结果:2
end
func();

说明了func()中的局部变量index是可以在inner()中被使用和更改的,index被称为inner()的upvalue。
以上这两点是构成闭包的基础,也是lua语言的强大和灵活之处。

另外,将上面例子稍加改造,如下:

function func()
    local index = 0;
    print("Hello");
    return function()
        print(index);
        index = index + 1;
    end
end
local inner = func();    --调用func()函数,返回内部函数给inner,打印结果:"Hello"
print(inner);        --打印结果:function:0037BE88
inner();          --调用内部函数,打印结果:0
inner();          --调用内部函数,打印结果:1
local other = func();    --获取一个内部函数实例,打印结果:"Hello"
other();          --调用一个内部函数实例,打印结果:0
other();          --同上,打印结果:1

由此可以看出函数的局部变量是可以保存在函数内部的,通过调用函数内嵌的函数可以获取修改局部变量的值,该函数的局部变量(upvalue)和内嵌函数的组合使用,形成了闭包,这看起来与C++中类的成员变量有些类似。函数具有闭包的功能后,不必再担心其局部变量没办法保存了,这一点对程序员的影响是很大的。
还有如下例子:
function func() 
    local index = 0;
    return function()
        index = index + 1;
        return index;
    end
end
local inner = func();
print(inner());      --打印结果:1
print(inner());      --打印结果:2
调用了func()的内部函数实例,并将函数调用结果打印了出来,是个很好的保存局部变量的方式。 另外闭包常用于泛型for的迭代器中,由于太晚了,就不再赘述了。有问题欢迎讨论拍砖。

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...