在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