Access local variable by name

2020-02-13 13:39发布

With globals you can use _G[name] to access the global variable name if you have a string "name":

function setGlobal(name, val)
   _G[name] = val
end

If you have

-- module.lua
local var1
local var2

there is no _L that would allow you to do the equivalent for locals:

function setLocal(name, val)
   _L[name] = val -- _L doesn't exist
end

Is there another way that you could access a local variable by string representing its name?

标签: lua
2条回答
祖国的老花朵
2楼-- · 2020-02-13 13:55

I strongly recommend not using getLocal, it's a function in the debug library which should never be used in official commercial uses because it affects performance and opens huge vulnerabilities for hackers to exploit! Never depend on debug functions for your logic. If you really need this, then why not define a dictionary _L, then:

local _L = {}
_L.var1 = ...
_L.var2 = ...

The pattern above is not against the rules of Lua's design.

查看更多
三岁会撩人
3楼-- · 2020-02-13 14:06

You can use debug.gelocal() and debug.setlocal() in the debug library:

function setLocal(name, val)
    local index = 1
    while true do
        local var_name, var_value = debug.getlocal(2, index)
        if not var_name then break end
        if var_name == name then 
            debug.setlocal(2, index, val)
        end
        index = index + 1
    end
end

Test:

local var1
local var2
setLocal("var1", 42)
print(var1)

Output: 42

查看更多
登录 后发表回答