intfunctionIndex=0;publicvoidInitClouse(lua_State*L){// create c closureCClosure*c=luaF_newCclosure(L,2);//2代表有2个upvaluec->f=&AddUpValues;//声明闭包对应的函数// init two upvalueslua_pushinteger(L,1);lua_setupvalue(L
debug.setupvalue (counter,2,10) end i = i + 1 end -- if until not name print(counter())执行以上代码输出结果为:1 2 index 1 k = 1 index 2 n = 2 11在以上实例中,计数器在每次调用时都会自增1。实例中我们使用了 getupvalue 函数查看局部变量的当前状态。我们可以设置局部变量为新值。实例中...
lua_setupvalue# [-(0|1), +0, –] const char *lua_setupvalue (lua_State *L, int funcindex, int n); 设置闭包上值的值。 它把栈顶的值弹出并赋于上值并返回上值的名字。 参数 funcindex 与n 和lua_getupvalue 中的一样 (参见 lua_getupvalue)。 当索引大于上值的数量时,返回 NULL (什么也...
lua 函数内操作全局变量 lua设置变量 我们经常会需要知道一个函数的局部变量而进行调试。为此可以使用setupvalue设置并使用getupvalue获取这些局部变量、。一个简单的例子对本如下所示 function newCounter () local n = 0 local k = 0 return function () k = n n = n + 1 return n end end counter = ne...
const char *lua_setupvalue (lua_State *L, int funcindex, int n); 同样的,也可以利用调试库中的debug.setlocal和debug.setupvalue来完成同样的功能。 5. 小结 到这里,我们就把Lua语言中与调试有关的机制和代码都理解清楚了,剩下的问题就是如何利用它提供的这些接口,来编写一个类似gdb一样的调试器。 就好...
setupvalue() 设置函数的上值。traceback() 返回调用栈的信息,可加入消息和指定回溯层。常用调试函数一览。以下示例演示了traceback和getinfo的使用,getinfo返回函数信息表。示例:使用traceback和getinfo。执行后输出包含函数信息的表。另一个例子:通过getupvalue查看和设置局部变量。执行代码,计数器每次...
13.setupvalue (f, up, value): 这个函数将 value 设为函数 f 的第 up 个上值。 如果函数没有那个上值,返回 nil 否则,返回该上值的名字。 14.traceback ([thread,] [message [, level]]): 如果message 有,且不是字符串或 nil, 函数不做任何处理直接返回 message。 否则,它返回调用栈的栈回溯信息。
debug.setupvalue(f, up, value) 与"debug.setupvalue()"的功能相对,将函数"f"("Closure")的第"up"个"upvalue"的值设置为"value"。 函数返回被设置的"upvalue"的名字。如果指定的"up"索引越界,则返回"nil"。 注:获取与设置"upvalue"与"Closure"是否被调用(是否在调用栈上)无关。]] ...
debug.setupvalue(func, i, value) return"upvalue" end end -- 省略 end _ENV表中查找 如果在普通的上值中还是没有找到,我们就去_ENV表中查找。首先调用_getvarvalue获取到_ENV表,注意这里的isenv标志为true。如果如果找到了_ENV表且表中存在名为name的变量,就修改其值为value,然后返回"global"以指示是修改...
13.setupvalue (f, up, value): 这个函数将 value 设为函数 f 的第 up 个上值。 如果函数没有那个上值,返回 nil 否则,返回该上值的名字。 14.traceback ([thread,] [message [, level]]): 如果message 有,且不是字符串或 nil, 函数不做任何处理直接返回 message。 否则,它返回调用栈的栈回溯信息。