2014-03-31 39 views
9

有了全局,您可以使用_G[name]访问全局变量name,如果你有一个字符串“名”:访问本地变量

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

如果你有

-- module.lua 
local var1 
local var2 

没有_L这将允许你做当地人的等价物:

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

是否有另一种方法可以通过表示其名称的字符串访问局部变量?

+1

为什么你需要这个? – lhf

+1

@lhf现在我不需要它了,但我只是好奇,因为我需要使用全局变量来做这件事,而且我更喜欢将变量放在本地,所以如果我需要与当地人一起做,我该怎么做? – Schollii

回答

5

可以在debug library使用debug.gelocal()debug.setlocal()

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 

测试:

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

输出:42

+0

+1在自己的武器库中有很好的技巧。即使使用调试库,至少它可以用于特定的调试环境。然而,因为它使用了调试,所以我现在还不会接受它(我怀疑没有其他办法,只需使用开箱即用的Lua,但我不想放弃希望:)。 – Schollii

0

我强烈使用的getLocal 建议,这是在一个函数图书馆的debug d 从不被用于官方商业用途,因为它会影响性能并为黑客攻击开辟巨大漏洞!永远不要依赖于你的逻辑调试功能。 如果你真的需要这一点,那么为什么不定义字典_L,则:

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

图案上面是不是针对Lua的设计规则。

+1

我并不是说建议使用调试功能,但它在需要时起作用。我相信OP已经知道如何使用表来存储这样的变量。 –

+1

这是一个很好的尝试,你说得对,你必须避免使用调试库,但是这种技术并没有解决通过字符串名访问局部变量的问题;如果不是本地的('_G [“var1”]'),我特意询问是否有任何方法通过“var1”访问“local var1”。但我感谢你的贡献。 – Schollii