Lua:检查局部变量或全局变量

有没有一种方法可以检查变量是全局的还是局部的?我的意思是使用编程设施来完成,而不是通过阅读代码来完成? 例如

print(type(a))=>"number",
print(checklocal(a))=>true
点赞
用户5525442
用户5525442

变量的作用域

在特定的作用域中,变量是局部的。你可以通过调用 debug.getlocal(StackLevel, Index) 来访问任何活动函数的局部变量,它会返回两个值:

  1. 变量的名字

  2. 变量的值

     -- 例子
     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')
    -- 结果
    --   var    xyz
    --   v1     1
    --   v2     2
    --   v3     3
    --   a      5
    

local isGlobal = 99testFunc() 的作用域之外,因此它不会被输出。所有其他在 testFunc() 作用域内的变量都带有它们的值一起被输出。

2018-11-10 10:05:09
用户1424244
用户1424244

任何给定变量的局部性都可以从源中确定,因此如果您使用纯Lua编程,则我看不出这样做的任何目的。我想它可能在预处理某些情况下有用,因此以下是一种方法,而不必取决于名称:

local variable
print(debug.getupvalue(function()variable()end, 1) ~= "_ENV")

对于本地变量,function()variable()end 将其捕获为一个上值(debug.getupvalue将返回“ variable ”)。如果 variable 被解析为全局变量,则函数必须将全局环境 _ ENV 存储为上值(使用变量名称进行索引)。在函数中不需要调用variable,这仅是“ 使用”它的最短方法。如果 variable_ENV,它始终会打印false(即使_ENV始终是本地的)。

另一个可选项,它对 _ENV 工作正常:

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

function()_ENV(variable)end总是捕获 _ENV,并且如果它是本地变量,则也捕获variable,因此检查第二个索引确定变量是本地的还是全局的。

从Lua 5.2开始可行。

要使用没有使用调试库的解决方案,可以暂时在 _ENV 上设置 __newindex __元方法,分配一些值,然后检查是否调用了元方法。

2018-11-10 12:33:17