在Lua中打印当前作用域可访问的所有局部variables
我知道如何使用下面的代码打印“全部”全局variables
for k,v in pairs(_G) do print("Global key", k, "value", v) end  所以我的问题是如何为当前正在执行的函数可访问的所有variables执行此操作,这些操作可以执行locals()对Python的操作。 
 这里是一个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 
请注意,在lua REPL中,每一行都是一个单独的块,具有不同的本地人。 此外,返回内部variables(名称以'('开头,如果你想删除它们):
 > local a = 2; for x, v in pairs(locals()) do print(x, v) end a 2 (*temporary) function: 0x10359b38 
感谢你的接纳。 你已经解开了最后一块难题! 😉
  Upvalues是来自外部作用域的局部variables,在当前函数中使用。 他们既不在_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 
例子(注意你必须使用它来显示):
 > local a= 2; function f() local b = a; for x,v in pairs(upvalues()) do print(x,v) end end; f() a 2 
 使用debug.getlocal 。 
 请参阅debug.getlocal : 
 local foobar = 1 local i = 0 repeat local k, v = debug.getlocal(1, i) if k then print(k, v) i = i + 1 end until nil == k 
输出:
 foobar 1 i 2 
 上面的Maygarden法官的问题只是local i = 0 。 它什么都不做,因为第一个索引用'0'将总是返回零。 
记住Lua索引默认以'1'开始,而不是像C / C ++那样的'0'。 您可以使用“0”作为自己的types的索引,但默认function默认为“1”作为第一个索引。
 只要将其更改为local i = 1 ,他的循环将正常工作。 
您可以使用getfenv获取本地环境。
getfenv([f])返回函数使用的当前环境。 f可以是一个Lua函数或一个数字,指定该堆栈级别的函数:级别1是调用getfenv的函数。 如果给定函数不是Lua函数,或者如果f是0,getfenv返回全局环境。 f的缺省值是1。
编辑:对不起,我错了。
 我只是检查了Lua源代码。  debug.getlocal()是获取本地variables的唯一方法。 
  Lua使用一个内部的Proto结构,并没有给我们访问。 
  (Proto包含本地属性和一个父级Proto引用,通过使用getfenv迭代函数的Proto, 
 我们也迭代inheritance的属性,而不是我们想要的) 
 用户可以使用环境和set/getfenv函数或使用metatable来定义Proto 。