2014-07-13 37 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'反射。 –