lua语言有如下两个特点:
成都创新互联从2013年创立,是专业互联网技术服务公司,拥有项目成都网站制作、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元乐清做网站,已为上家服务,为乐清各地企业和个人服务,联系电话:135182197921.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的迭代器中,由于太晚了,就不再赘述了。有问题欢迎讨论拍砖。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文名称:lua语言中闭包的学习心得-创新互联
分享链接:http://lswzjz.com/article/hsssc.html