在Lua中,你可以一個功能轉換到它返回一個字符串,這似乎是一個地址字符串轉換爲功能
print(print)
function: 0x41a360
是否有可能做反向?例如
local aliasPrint = function: 0x41a360
aliasPrint("Hello, World!")
Hello, World!
我在網上查找了一個解決方案,但我的谷歌福可能缺乏。
在Lua中,你可以一個功能轉換到它返回一個字符串,這似乎是一個地址字符串轉換爲功能
print(print)
function: 0x41a360
是否有可能做反向?例如
local aliasPrint = function: 0x41a360
aliasPrint("Hello, World!")
Hello, World!
我在網上查找了一個解決方案,但我的谷歌福可能缺乏。
實際上,你並沒有將函數轉換爲字符串。 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
在其表示中包含了這一點。許多語言有類似的東西,但並不總是表現出獨特性。 (有些在調試器中顯示更多屬性。)
太棒了!我注意到一些系統函數無法被轉儲,有沒有辦法在你轉儲之前(即在一個循環中)檢查它們以防止錯誤?至於爲什麼,這只是我在通過一些基本的Lua工作時遇到的一個問題。 – user142532
您可以先致電[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)。 –
Lua沒有反射,但函數名稱作爲字符串存儲在內存中作爲「鍵」。您可以以類似的方式實現
local aliasPrint = _ENV["print"]
aliasPrint("Hello, World!")
輸出:
Hello, World!
_ENV
是Lua的全局變量的運行環境的查找表(爲lua v5.1-,使用_env
代替)
如果您在對象中使用某個功能,只需使用或table_or_object["function_name"]
。
你提出了一些很好的觀點,但你的解釋可能會導致誤解。像所有其他值一樣,函數沒有名稱。您正在描述全局變量和表格字段。變量有名字。表字段有鍵,可以將其視爲名稱,特別是如果它們是有效標識符的字符串。 –
至於反射,我會稱'對'和'debug.getinfo'反射。 –
你可以簡單地做'aliasPrint = print'。你想達到什麼目的? – lhf