访问非局部变量
调试库还提供了函数 getupvalue, 该函数允许我们访问一个被 Lua 函数所使用的非局部变量。与局部变量不同,被一个函数所调用的非局部变量即使在引用它的函数已经不活跃的情况下也会一直存在(闭包的实质)。因此,函数 getupvalue 的第一个参数不是栈层次,而是一个函数(更确切地说,是一个闭包)。函数 getupvalue 的第二个参数时变量索引,Lua 语言按照函数引用非局部变量的顺序对它们进行编号,但由于一个函数不能用同一名称访问两个非局部变量,所以实际上这个顺序是无关紧要的。
通过函数 debug.setupvalue 可以更新非局部变量的值。这个函数有三个参数: 一个闭包、一个变量索引和一个新值。 与函数 setlocal 一样,该函数返回变量名,如果变量索引超出范围则返回 nil。
function getvarvalue (name, level, isenv)
local value
local found = false
level = (level or 1) + 1
for i = 1, math.huge do
local n, v = debug.getlocal(level, i)
if not n then break end
if n == name then
value = v
found = true
end
end
if found then return "loca