学习Lua的迭代器的时候有个闭包的概念,这个很特别。
Lua中的函数是一阶值,就是说函数可以作为参数,返回值,可以作为右值赋给变量。那么在一个函数内就可以再定义函数,就像定义一个变量一样。内部函数可以访问外部函数的局部变量,这种变量又叫upvalue。闭包的实现关键就是这个upvalue。
简单来区分函数和闭包的区别。可以说函数是特殊的闭包,而闭包不是函数。闭包是函数和起运行环境的整体。
写个例子:
function newCounter()
local i = 0
return function()
i = i+1
return i
end
end
c1=newCounter()
print(c1())
print(c1())
看这段代码,匿名函数访问一个upvalue i,这个变量用来保存一个计数器。第一次调用的时候肯定会打印1。第二次调用会打印多少呢。答案是2。
我的理解是,闭包是函数和他的upvalue组成的整体。我不知道这个upvalue变量是怎么实现的,网上有资料说是这个变量会被保存在堆栈,调用的时候会创建其副本,不管怎么样,闭包的外在表现就是可以保存这个upvalue变量,后续调用可以访问这个变量。
如果有兴趣可以看起源码实现。
不知道说清楚了没有,就当做个笔记吧。
分享到:
相关推荐
lua学习资料lua学习资料lua学习资料lua学习资料
主要介绍了LUA中的闭包(closure)浅析,本文给出实例讲解LUA中的闭包,需要的朋友可以参考下
今天看见技术群里不少人在谈论Lua脚本语言,于是我有个想法学习Lua! 刚开始呢,什么也不懂。搜了下相关文章,供大家共同学习参考!
Lua学习入门教程。适合初级入门者使用。
lua 学习
在Android项目中使用Lua,需要两个步骤: 1、加载Lua脚本解析引擎。 2、以Native API方式调用引擎接口 直接以JNI方式调用Lua解析引擎的接口十分麻烦,开源项目LuaJava(https://github.com/mkottman/AndroLua )...
Lua学习的小框架,csdn学习地址http://blog.csdn.net/liuwumiyuhuiping/article/details/9196435 大家共同学习
主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下
包括Programming in Lua+Lua 5.1 参考手册+LUA5.0.2解释器,是学习LUA必备资料
本文首先通过具体的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理,以及lua中表与函数的3种表达方式的汇总
学习lua的阶段总结。请使用xmind打开
lua手册(学习lua好帮手) lua手册(学习lua好帮手) lua手册(学习lua好帮手)
lua语法 lua学习新手 基础 经典 有用分享给大家
经典lua 学习资料,lua学习资料,值得收藏
搜集资料的整理,初学lua的朋友不用到处去找了。lua的资料实在不好找
lua中文版 包含手册 适合初学者
所有版本LUA源码 lua-5.3.5 lua-5.3.4 lua-5.3.3 lua-5.3.2 lua-5.3.1 lua-5.3.0 lua-5.2.4 lua-5.2.3 lua-5.2.2 lua-5.2.1 lua-5.2.0 lua-5.1.5 lua-5.1.4 lua-5.1.3 lua-5.1.2 lua-5.1.1 lua-5.1 lua-5.0.3 lua-...
lua基础知识,
lua (vc环境)学习笔记(学习代码) lua (vc环境)学习笔记(学习代码) lua (vc环境)学习笔记(学习代码)
lua 学习源码