lua闭包浅析及项目应用
lua函数与闭包:
原文地址:http://www.doc88.com/p-6681238341344.html
近日查阅关于lua的一些资料,找到了我能理解的关于lua函数与闭包的解析,我觉得这个程度是我目前所能理解的,特此记录并分享。
1.
Lua的函数是一种“第一类值”,即它可以存储在变量或table里,也可以作为实参或“高阶函数”传递给其他函数调用,或作为其它函数的返回值,Lua中的函数的这种特性,使它成为一种灵活,极具弹性的数据类型,同时,也让它延续哼出一些特殊的功能强大的语言机制:闭包。Lua中的函数是带有词法作用域的第一类值,也可以说是函数变量的作用域,即函数的变量有一定的作用范围,变量只能在此范围内可见或被访问。
例如下面的代码段:
function count()
local uv = 0
local function retfun()
uv = uv + 1
print(uv)
end
return retfun
end
函数retfun定义在函数count中,也可以把函数retfun看作是函数count的内嵌函数,而函数count视为函数的retfun的外包函数。内嵌函数能访问外包函数已经创建的所有局部变量,这种特性就是上文所提到的词法作用域,而这些局部变量(如 uv),则成为该内嵌函数的外部局部变量或upvalue。而当我们执行函数count时有如下结果。
c1 = count()
c1() -- 1
c2() -- 2
对于函数count里的局部变量uv,当执行完"c1 = count()"后, 他的生命周期本该结束,但是因为他已经成为了内嵌函数retfun的upvalue,返回的内嵌函数retfun以upvalue的方式把uv的值保存起来,因此可以正确地把值打印出来。这种局部变量在函数返回后会继续存在,并且返回的函数可以正常调用那个局部变量,独立执行其逻辑操作的现象,在Lua中称之为闭包(closure).闭包是个独立存在的个体,我们在将函数count值赋值给变量c2,
c2 = count()
c2() -- 1
c2() -- 2
c1和c2都是相同的函数体,但是输出的值却不一样。这是因为闭包是由相应函数原型的引用和upvalue组成。当调用函数造成upvalue值改变时,这只会改变与其对应闭包的upvalue值,不会影响到其他闭包里的upvalue值,从而保持了闭包个体的完整性。闭包在上下文环境中提供很有用的功能:可以作为高级函数的参数;作为函数嵌套的函数;也可以用在回调函数中等。
2. 应用
之前提到,目前项目用的是skynet,在推送消息的时候需要为每个消息提供一个session值。了解skynet的同学都知道逻辑大部分是写在agent中的但是多个人开发过程中,我们将不同的功能在逻辑上做了划分,例如邮件系统,专门有个emailmgr的脚本来实现,但是实际上还是属于agent的这样主脚本agent中的主动推送函数要传递到各个"分脚本"中。我们希望让整个agent维护一个session,也就是无论哪个模块调用推送函数,都是对同一个session加一操作。这样的一个很自然的想法是在用户登录agent的时候,创建一个session,初始值为1,然后每次推送后都要对session加一。但是这样的话问题就出现了,session若定义成个local number值,那么在传递的时候实际上是传值调用的,也就是各个脚本不会改变agent中的session值。于是便想到了用一个闭包解决此问题。用的函数和例子几乎一样,在agent初始化变量的时候创建闭包,然后各个模块引用此闭包,那么这样就可以直接对该闭包的同一个upvalue进行操作,即可实现所有模块推送时公用此session(upvalue)。
目前游戏功能模块逻辑还没全部完成,也没多少时间分析lua的一些特性,对其理解也比较浅显,仍然处于应用阶段。因此其中难免出现各种错误,望指正。
lua闭包浅析及项目应用的更多相关文章
- 关于lua闭包导致引用无法释放内存泄露
最近项目存在严重的内存泄漏问题,每次切level 会增加20M无法释放的内存,翻遍了项目用了多个工具,查询资料等 发现项目中两种存在内存泄露的情况 1.lua闭包的不当使用,对比包的引用要及时 释放. ...
- LUA闭包概念演示
闭包的一个重要场景,形成一个自治的环境, 让操作可以封闭运行, 即函数运行时有状态的,可以从闭包创建时候的环境独立开来. 例如下面的lua闭包, genFilter 其入参parmIn是 函数的内部变 ...
- 对 Lua闭包 知识点的学习的总结 ,在这里和大家分享一下,希望对大家有所帮助
Lua闭包 --当一个函数内部嵌套另外一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征为词法定界.--闭包是由函数与其相关的引用环境组合而成的实体 闭包=函数+引用环境--不是在局部 ...
- C# LUA 闭包
许多语言中有闭包的概念,C#的闭包以lambda表达式表现,可以实现与LUA完全一样的效果. //LUA------------------------------------------------ ...
- lua闭包与简易迭代器实现
1.什么是闭包 闭包,又称闭合函数(closure).通常,如果将一个函数写在另一个函数内,那么这个在内部的函数就可以访问到外部函数中的局部变量,这个特征就是词法域,有些资料上也叫它词法定界.闭包指的 ...
- java翻译lua+c+openssl签名项目
原来项目中用openresty nginx+lua实现server,lua调用c动态链接库,来使用openss做签名,并生成130字节(128签名+2位自定义字节)长度的文件. nginx: loca ...
- lua闭包函数
function createCountdownTimer(second) local ms = second * local function countDown() ms = ms - retur ...
- 【javascript】作用域和闭包浅析
作用域 分全局作用域和局部作用域 全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用. 局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用. var val=1; //全 ...
- lua 闭包
--匿名函数使用upvalue i保存他的计数, 闭包是一个函数加上它可以正确访问的upvalues function newCounter() return function() i = i + r ...
随机推荐
- 【转】开发者应该了解的API技术清单
[转载贴] 作为一名开发者,诚然编写代码如同作家提笔挥毫,非常有成就感与乐趣,但同时我也觉得删除代码是件不相伯仲的美事.为什么呢?因为在进行删除工作 时,意味着自己找出了造成干扰的位置,意味着找到了冗 ...
- tomcat开启远程调试
tomcat开启远程调试模式: 需要在启动脚本中的 JAVA_OPTS='-server -Xms1024m -Xmx1024m -Xmn384m -Xss256k -XX:PermSize=128m ...
- 【BZOJ2969】矩形粉刷 概率+容斥
[BZOJ2969]矩形粉刷 Description 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以 ...
- 【BZOJ1731】[Usaco2005 dec]Layout 排队布局 差分约束
[BZOJ1731][Usaco2005 dec]Layout 排队布局 Description Like everyone else, cows like to stand close to the ...
- 【转】.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
阐述签名工具这个概念之前,我先说说它不是什么: 1.它不是用于给程序集加密的工具,它与阻止Reflector或ILSpy对程序集进行反编译一毛钱关系都没有. 2.它很讨厌人们把它和加密联系在一起. 我 ...
- opencv如何打印长图?
cv::Mat longMap(std::vector<cv::Mat> &set) { int matNumber = set.size(); int width = set[0 ...
- Linux下安装Java环境配置
1.下载安装文件 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2. ...
- springMVC文件的上传与下载
1.文件上传 springmvc中只需要配置上传组件,然后配合使用MultipartFile,就可以轻松实现单个文件上传和批量上传,而且上传的文件类型和大小都可以在springmvc 配置文件中配置. ...
- solrcloud配置步骤
SolrCloud是Solr4.0版本以后基于Solr和Zookeeper的分布式搜索方案.SolrCloud是Solr的基于Zookeeper一种部署方式. 版本信息:solr版本6.2.0+tom ...
- Django的Model继承abstract,proxy,managed。。。
Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...