2014-03-31 37 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