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()的内部函数实例,并将函数调用结果打印了出来,是个很好的保存局部变量的方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。