在本文中,我们将给您介绍关于关于lua的闭包的详细内容,并且为您解答Closure和Upvalue的相关问题,此外,我们还将为您提供关于closurePHP闭包(Closure)初探、luacclos
在本文中,我们将给您介绍关于关于lua的闭包的详细内容,并且为您解答Closure和Upvalue的相关问题,此外,我们还将为您提供关于closure PHP闭包(Closure)初探、lua cclosure 的 upvalue 数量限制(转自云风的blog)、LUA中的闭包(closure)浅析、lua学习笔记之Lua的function、closure和upvalue的知识。
本文目录一览:- 关于lua的闭包(Closure)和Upvalue(lua中的闭包)
- closure PHP闭包(Closure)初探
- lua cclosure 的 upvalue 数量限制(转自云风的blog)
- LUA中的闭包(closure)浅析
- lua学习笔记之Lua的function、closure和upvalue
关于lua的闭包(Closure)和Upvalue(lua中的闭包)
关于lua的闭包(Closure)和Upvalue
upvalue:嵌套函数的外部函数的局部变量
function func(a) <== 这个函数返回值是一个函数
return function ()
a = a + 1 <== 这里可以访问外部函数func的局部变量a,这个变量a就是upvalue
return a
end
end
func返回一个匿名函数,可用变量接取之。该匿名函数有一个upvalue a(有点像C函数的static变量),初值为首次调用func时的参数
闭包:一个匿名函数加上其可访问的upvalue
c = func(1) <== c现在指向一个拥有upvalue a = 1的匿名函数,c也被称作一个闭包
c() <== 返回2
c() <== 返回3
c2 = func(1) <== c2现在指向另外一个拥有upvalue a = 1的匿名函数,c2也被称作一个闭包
c2() <== 返回2
下面是示例代码:
int
generatecclosure(lua_State *L) /* 闭包产生器 */
{
lua_pushnumber(L,0); /* 压入第一个upvalue */
lua_pushnumber(L,0); /* 压入第二个upvalue */
lua_pushcclosure(L,cclosure,2); /* 压入闭包的同时也把upvalue置入该闭包的upvalue表 */
return 1; /* 返回闭包 */
}
int
cclosure(lua_State *L)
{
double upval1,upval2;
upval1 = lua_tonumber(L,lua_upvalueindex(1)); /* 注意upvalue索引1,2是闭包依赖的,不会和其他的闭包中的索引冲突 */
upval2 = lua_tonumber(L,lua_upvalueindex(2));
upval1++; upval2++;
lua_pushnumber(L,upval1); lua_replace(L,lua_upvalueindex(1));/* 更新upvalue1 */
lua_pushnumber(L,upval2); lua_replace(L,lua_upvalueindex(2));/* 更新upvalue2 */
lua_pushnumber(L,upval1 + upval2);
return 1;
}
int
generatecclosure2(lua_State *L)
{
lua_pushnumber(L,10);
lua_pushnumber(L,10);
lua_pushcclosure(L,cclosure2,2);
return 1;
}
int
cclosure2(lua_State *L)
{
double upval1,lua_upvalueindex(1));
upval2 = lua_tonumber(L,lua_upvalueindex(2));
upval1++; upval2++;
lua_pushnumber(L,lua_upvalueindex(1));
lua_pushnumber(L,lua_upvalueindex(2));
lua_pushnumber(L,upval1 + upval2);
return 1;
}
然后向lua虚拟机注册一下全局函数:
lua_register(L,"generatecclosure",generatecclosure);
lua_register(L,"generatecclosure2",generatecclosure2);
最后执行main.lua:
c = generatecclosure() c2 = generatecclosure2() print(c()) -- 2 print(c()) -- 4 print(c2()) -- 22 print(c2()) -- 24
closure PHP闭包(Closure)初探
lua cclosure 的 upvalue 数量限制(转自云风的blog)
总结
以上是小编为你收集整理的lua cclosure 的 upvalue 数量限制(转自云风的blog)全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
LUA中的闭包(closure)浅析
之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下
lua的函数是一种 First-Class Value 的东西, 到底是啥?
就是它们与传统类型的变值没啥区别,
可以 存到一个变量中,
可以 存到table中,
可以 作为实参传递给其它函数,
可以 作为其它函数的返回值.
它们还具有特定的词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量.
如下面的例子:
function test(x)
return function (value)
return value * x
end
end
func = test(10)
print( func(11) )
在test()中,嵌套了一个匿名函数作为返回值, 而在这个匿名函数中 可以访问外部的 value 变量
再看另一个例子
function newCounter()
local i = 0
func = function()
i = i + 1
return i
end
return func
end
c = newCounter()
print(c())
print(c())
c1 = newCounter()
print(c1())
print(c1())