Lua 中 debug.getlocal 函数的混淆

我在 这里 看到了如何使用 Lua (5.1) 中的 debug.getlocal 函数将局部变量插入表中。

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

但是,当我尝试返回创建的表并访问其条目时,它不起作用。

function test1()
    local v = '我是一个局部变量!'
    return locals()
end

print(test1().v) -- nil

经过一些尝试和错误,我注意到在返回之前将表绑定到变量或仅仅添加括号可以解决这个问题:

function test2()
    local v = '我是一个局部变量!'
    return (locals())
end

print(test2().v) -- '我是一个局部变量!'

这让我非常困惑。为什么这两个程序有任何不同?我缺少了什么理解?locals() 位于尾调用位置是否有任何区别?

点赞