Lua:检查局部或全局变量

时间:2018-11-10 06:19:08

标签: variables lua

是否可以检查变量是全局变量还是局部变量?我的意思是使用编程工具而不是通过阅读代码来做到这一点? 例如

print(type(a))=>"number", 
print(checklocal(a))=>true

2 个答案:

答案 0 :(得分:0)

变量在一定范围内是局部的。是的,您可以通过调用debug.getlocal(StackLevel, Index)来访问任何活动函数的局部变量,它返回两个值:

  1. 变量名
  2. 变量值

     -- Example 
     local isGlobal = 99
     function testFunc(var)
         local v1, v2, v3 = 1, 2, 3
         local a = 1
         while true do
             local name, value = debug.getlocal(1, a)
             if not name then break end
             print(name, value)
             a = a + 1
         end
    end
    
    testFunc('xyz')
    -- Result
    --   var    xyz
    --   v1     1
    --   v2     2
    --   v3     3
    --   a      5
    

local isGlobal = 99在我们的testFunc()范围之外,因此getlocal不会打印它,而在testFunc范围内的所有其他变量都将打印其值。

答案 1 :(得分:0)

任何给定变量的局部性始终可以从源代码中确定,因此,如果您使用纯Lua编程,我将看不到任何目的。我想它可能在您进行一些预处理的情况下很有用,所以这是一种处理方法,而不必依赖名称:

local variable
print(debug.getupvalue(function()variable()end, 1) ~= "_ENV")
对于局部变量,

function()variable()end将其捕获为高值(debug.getupvalue将返回"variable")。如果将variable解析为全局变量,则该函数必须将全局环境_ENV存储为upvalue(使用变量名建立索引)。无需在函数中调用variable,这只是“使用”它的最短方法。如果variable_ENV,它将始终打印false(即使_ENV始终是本地的)。

另一个选项,该选项对_ENV正确起作用:

local variable
print(debug.getupvalue(function()_ENV(variable)end, 2) ~= nil)

function()_ENV(variable)end始终会捕获_ENVvariable(如果它是本地的),因此检查第二个索引可以确定变量是否是本地的。

这从Lua 5.2开始有效。

对于不使用调试库的解决方案,您可以在__newindex上临时设置_ENV元方法,在周围分配一些值,并检查是否调用了该元方法。

相关问题