localfunction_getvarvalue(name, level, isenv) local value local found = false -- 加1将层次纠正为包括_getvarvalue自己 level = (level or1) + 1 -- 尝试局部变量 for i = 1, math.hugedo local n, v = debug.getlocal(level, i) ifnot n thenbreakend if n == name then value = v found = true -- 这里不跳出,获取具有最大索引的那个局部变量 end end if found thenreturn"local", value end -- 省略 end
localfunction_getvarvalue(name, level, isenv) -- 省略 -- 尝试非局部变量 local func = debug.getinfo(level, "f").func for i = 1, math.hugedo local n, v = debug.getupvalue(func, i) ifnot n thenbreakend if n == name thenreturn"upvalue", v end end -- 省略 end
localfunction_getvarvalue(name, level, isenv) -- 省略 if isenv thenreturn"noenv"end-- 避免无限循环 -- 没找到,从环境中获取 local _, env = _getvarvalue("_ENV", level, true) if env then return"global", env[name] else return"noenv" end end
$ lua test.lua (local)foo test.lua:12 lua_debug> pv("a") local 4 lua_debug> pv("u") upvalue 2 lua_debug> pv("g") global 1 lua_debug> pv("x") x not found lua_debug>