打印Lua中当前作用域可访问的所有局部变量

Edu*_*ipe 27 lua introspection

我知道如何使用以下代码打印"所有"全局变量

for k,v in pairs(_G) do
    print("Global key", k, "value", v)
end
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何为当前正在执行的函数可访问的所有变量执行此操作,这可以locals()为Python 做什么.

u0b*_*6ae 34

这是一个locals()函数的实现.它将从调用范围返回一个本地表:

function locals()
  local variables = {}
  local idx = 1
  while true do
    local ln, lv = debug.getlocal(2, idx)
    if ln ~= nil then
      variables[ln] = lv
    else
      break
    end
    idx = 1 + idx
  end
  return variables
end
Run Code Online (Sandbox Code Playgroud)

请注意,在lua REPL中,每一行都是一个单独的块,具有不同的本地.此外,返回内部变量(名称以'('开头,如果你想删除它们):

> local a = 2; for x, v in pairs(locals()) do print(x, v) end
a   2
(*temporary)    function: 0x10359b38
Run Code Online (Sandbox Code Playgroud)

感谢你的接纳.你已经解开了拼图的最后一块!;-)

Upvalues是来自外部作用域的局部变量,用于当前函数.他们既不在_G也不在locals()

function upvalues()
  local variables = {}
  local idx = 1
  local func = debug.getinfo(2, "f").func
  while true do
    local ln, lv = debug.getupvalue(func, idx)
    if ln ~= nil then
      variables[ln] = lv
    else
      break
    end
    idx = 1 + idx
  end
  return variables
end
Run Code Online (Sandbox Code Playgroud)

示例(注意您必须使用它来显示):

> local a= 2; function f() local b = a; for x,v in pairs(upvalues()) do print(x,v) end end; f()
a   2
Run Code Online (Sandbox Code Playgroud)


lhf*_*lhf 6

使用debug.getlocal.

  • 对于那些用我问的问题上网的人来说,它太短了.但无论如何,谢谢! (4认同)