在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1 upvalue概念 upvalue:嵌套函数的外部函数的局部变量 function func(a) <== 这个函数返回值是一个函数 return function () a = a + 1 <== 这里可以访问外部函数func的局部变量a,这个变量a就是upvalue return a end end func返回一个匿名函数,可用变量接取之。该匿名函数有一个upvalue a(有点像C函数的static变量),初值为首次调用func时的参数
2 closure概念: closure: 一个匿名函数加上其可访问的upvalue c = func(1) <== c现在指向一个拥有upvalue a = 1的匿名函数,c也被称作一个闭包
3 C函数如何向LUA递闭包 void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n)
static int _counter (lua_State *L) { // //获取第一个upvalue // double val = lua_tonumber(L, lua_upvalueindex(1));
lua_pushnumber(L, ++val);
/* void lua_pushvalue (lua_State *L, int index); 把栈上给定索引处的元素作一个副本压栈。 */ lua_pushvalue(L, -1);
/* void lua_replace (lua_State *L, int index); 把栈顶元素放置到给定位置而不移动其它元素(因此覆盖了那个位置处的值),然后将栈顶元素弹出 */ lua_replace(L, lua_upvalueindex(1));
return 1; /* return new value */ }
static int counter (lua_State *L) { lua_pushnumber(L, 0); // //压入初始化第一个upvalue // lua_pushcclosure(L, &_counter, 1); return 1; }
void testlupvalue() { lua_State *L;
L = luaL_newstate(); luaL_openlibs(L); lua_register(L, "counter", counter);
luaL_loadfile(L, "C:\\c.lua");
lua_pcall(L, 0,0,0);
lua_close(L); }
closure |
请发表评论