2014-07-13 75 views
1

在Lua中,你可以一個功能轉換到它返回一個字符串,這似乎是一個地址字符串轉換爲功能

print(print) 
function: 0x41a360 

是否有可能做反向?例如

local aliasPrint = function: 0x41a360 
aliasPrint("Hello, World!") 
Hello, World! 

我在網上查找了一個解決方案,但我的谷歌福可能缺乏。

+0

你可以簡單地做'aliasPrint = print'。你想達到什麼目的? – lhf

回答

3

實際上,你並沒有將函數轉換爲字符串。 string.dump在有限的情況下會這樣做。而且,load是相反的。

local function f() 
    print("I'm a function") 
end 

local d = string.dump(f) 
print(string.format("%q", d)) 

local g = load(d); 
g() 

至於你的方法,我只能問: 「爲什麼?」

tostring是一個函數,它提供了一個具有基本信息的對象的概念表示。在許多情況下(功能和表格),唯一性是一個重要的屬性。因此,tostring在其表示中包含了這一點。許多語言有類似的東西,但並不總是表現出獨特性。 (有些在調試器中顯示更多屬性。)

+0

太棒了!我注意到一些系統函數無法被轉儲,有沒有辦法在你轉儲之前(即在一個循環中)檢查它們以防止錯誤?至於爲什麼,這只是我在通過一些基本的Lua工作時遇到的一個問題。 – user142532

+0

您可以先致電[debug.getinfo](http://www.lua.org/manual/5.2/manual.html#pdf-debug.getinfo)。如果「what」字段是「C」,則不能轉儲該功能。如果nups字段大於0,請參閱[load](http://www.lua.org/manual/5.2/manual.html#pdf-load)。 –

0

Lua沒有反射,但函數名稱作爲字符串存儲在內存中作爲「鍵」。您可以以類似的方式實現

local aliasPrint = _ENV["print"] 
aliasPrint("Hello, World!") 

輸出:

Hello, World! 

_ENV是Lua的全局變量的運行環境的查找表(爲lua v5.1-,使用_env代替)

如果您在對象中使用某個功能,只需使用或table_or_object["function_name"]

+0

你提出了一些很好的觀點,但你的解釋可能會導致誤解。像所有其他值一樣,函數沒有名稱。您正在描述全局變量和表格字段。變量有名字。表字段有鍵,可以將其視爲名稱,特別是如果它們是有效標識符的字符串。 –

+0

至於反射,我會稱'對'和'debug.getinfo'反射。 –