lua中的closure(闭合函数)

若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数的局部变量。

function newCounter()

local i = 0

return function()----匿名函数

i = i + 1

return i

end

end

c1 = newCounter()

c2 = nweCounter()

print(c1())---->1

print(c1())---->2

print(c2())---->1

print(c1())---->3

print(c2())---->2

在匿名函数内部,i既不是全局变量也不是局部变量,将其称为“非局部的变量”。

初看上去,由于创建变量i的newCounter函数已经返回,所以之后每次调用匿名函数时,i都应该超出了作用域。但是其实lua会以closure机制来处理这种情况。closure就是一个函数加上该函数所访问的所有“非局部的变量”。如果再次调用newCounter时,那么会新创建一个新的局部变量i,从而产生一个新的closure,上面c1和c2是同一个函数创建的两个不同的closure,它们各自拥有局部变量i的实例,它们各自独立,导致打印结果没有关联。

时间: 2024-12-30 00:51:02

lua中的closure(闭合函数)的相关文章

Lua中的closure(闭合函数)

词法域:若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为“词法域”. 例:假设有一个学生姓名的列表和一个对应于没个姓名的年级列表,需要根据每个学生的年级来对他们的姓名进行排序(由高到低).可以这么做: names = {"Peter", "Paul", "Mary"} grades = {Mary = 10, Paul = 7, Peter = 8} table.sort(names, func

简述C/C++调用lua中实现的自定义函数

1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果.  2.具体怎么做? 一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境.用操作栈的规则和lua交互数据

Lua程序设计 closure(闭合函数)

若将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特征称之为"词法域". 假设有一个学生姓名的列表和一个对应于每个姓名的年级列表,需要根据每个学生的年纪来对他们的姓名进行排序. names = {"Peter", "Paul", "Mary"} grades = {Mary = 10, Paul = 7, Peter = 8} table.sort(names, function(n1,

Lua中的require

lua中的require机制    为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程.1.require机制相关的数据和函数    package.path:保存加载外部模块(lua中"模块"和"文件"这两个概念的分界比较含糊,因为这个值在不同的时刻会扮演不同的角色)的搜索 路径,这种路径是"模板式的路径",它里面会包含可替代符号"?",这

Lua中的闭包

[什么是闭包?] 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: function newCounter() local i = 0 return function () -- 匿名函数 i = i + 1 return i end end c1 = newCounter() print(c1()) print(c1()) 根据刚刚说的闭包的概念,结合上面的代码,来说说这个概念.闭包=函数+引用环境.上述代码中的newCounter函数返

Lua中的userdata

[话从这里说起] 在我发表<Lua中的类型与值>这篇文章时,就有读者给我留言了,说:你应该好好总结一下Lua中的function和userdata类型.现在是时候总结了.对于function,我在<Lua中的函数>这篇文章中进行了总结,而这篇文章将会对Lua中的userdata进行仔细的总结.对于文章,大家如果有任何疑议,都可以在文章的下方给我留言,也可以关注我的新浪微博与我互动.学习,就要分享,我期待你的加入. [userdata是啥?] userdata是啥?简单直译就是用户数

lua基础【二】lua中关于字符串的操作总结

--从从控制台输入字符串操作 str =io.read() if str=="hello" then print(str) end --lua中的字符串拼接操作 str="hello" str2="world" str3=str..str2 print(str3) --lua中的number与string类型的转换 a=10 b=tostring(a) if b == "10" then print(b) end c=tonu

【转载】lua中的require机制

[转载自]http://blog.chinaunix.net/uid-552961-id-2736410.html lua中的require机制 为了方便代码管理,通常会把lua代码分成不同的模块,然后在通过require函数把它们加载进来.现在看看lua的require的处理流程. 1.require机制相关的数据和函数    package.path:保存加载外部模块(lua中"模块"和"文件"这两个概念的分界比较含糊,因为这个值在不同的时刻会扮演不同的角色)的

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样: