print(debug.upvalueid(counter1, 1)) --> userdata: 005593D8 print(debug.upvalueid(counter1, 2)) --> userdata: 00559420 -- 让"counter"的第一个"upvalue"引用"counter1"的第二个"upvalue"。 debug.upvaluejoin(counter, 1, counter1, 2) -- "counter"的第一个"upvalue"与"counter1"的第二个"u...
GETUPVAL将B为索引的upvalue的值装载到A寄存器中。SETUPVAL将A寄存器的值保存到B为索引的upvalue中。 GETTABUP将B为索引的upvalue当作一个table,并将C做为索引的寄存器或者常量当作key获取的值放入寄存器A。SETTABUP将A为索引的upvalue当作一个table,将C寄存器或者常量的值以B寄存器或常量为key,存入table。 local u...
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 函数查看局部变量的当前状态。我们可以设置局部变量为新值。实例中...
在以实例中,我们使用到了 debug 库的 traceback 和 getinfo 函数, getinfo 函数用于返回函数信息的表。 另一个实例我们经常需要调试函数的内的局部变量。我们可以使用 getupvalue 函数来设置这些局部变量。实例如下:function newCounter () local n = 0 local k = 0 return function () k = n n = n + ...
我们也可以通过debug库的getupvalue函数访问Lua函数的upvalues。和局部变量不同的是,即使函数不在活动状态他依然有 upvalues(这也就是闭包的意义所在)。所以,getupvalue的第一个参数不是栈级别而是一个函数(精确的说应该是一个闭包),第二个参数是 upvalue的索引。Lua按照upvalue在一个函数中被引用(refer)的顺序依次编...
debug.getinfo 函数获得函数的当前表。 示例二 在调试过程中,我们常常需要查看或修改函数局部变量的值。因此,我们可以用 getupvalue 获得变量的值,用 setupvalue 修改变量的值。示例如下: function newCounter () local n = 0 local k = 0 return function () k = n n = n + 1 return n end end ...
localn, v =debug.getupvalue(func, i) ifnotnthenbreakend ifn == namethenreturn"upvalue", vend end -- 省略 end _ENV表中查找 如果在普通的上值中还是没有找到,我们就去_ENV表中查找。isenv标志表示当前name是否就是"_ENV",是用来防止无限循环调用的,第一次调用的时候肯定不是。然后将"_ENV"作为nam...
在以实例中,我们使用到了 debug 库的 traceback 和getinfo 函数, getinfo 函数用于返回函数信息的表。 另一个实例 我们经常需要调试函数的内的局部变量。我们可以使用 getupvalue 函数来设置这些局部变量。实例如下: 实例function newCounter () local n = 0 local k = 0 return function () k = n n = ...
函数getupvalue第一个参数不是栈层次,而是一个函数(更确切地说,是一个闭包)。函数 getupvalue 的第二个参数是变量索引, 语言按照函数引用非局部变量的顺序对它们编号,但由于一个函数不能用同一名称访问两个非局部变量, 所以这个顺序是无关紧要的。 (2)通过函数debug.setupvalue可以更新非局部变量的值 。该函数有...