是否可以通过所请求函数的内存地址加载函数变量?
aFunctionVar = loadFunc(memAddress)
if type(aFunctionVar) == 'function' then "this var is a function!" end
是否可以在Lua中使用loadFunc()?
答案 0 :(得分:3)
Lua函数(与大多数脚本语言中的函数一样)没有固定的内部地址[1]。每次Lua执行function
表达式时,它会在某个任意地址为它分配一个新的闭包。以前运行的函数闭包的地址完全没用;在当前运行期间,该地址几乎不可能存在功能。
即使你确实拥有同一进程中某个函数的内存地址,vanilla Lua也没有提供任何“加载”它的方法,无论是在脚本内部还是从C API中都没有。
如果需要序列化函数,可以使用string.dump
,它将返回传递函数的字节码字符串,可以使用loadstring
或load
加载,具体取决于Lua版本。请注意,此字节码独立于源函数的代码;无论您对源代码的更改如何,该函数都会执行转储时执行的任何操作。此外,string.dump
无法序列化函数的upvalues。
[1]哎呀,即使C函数也可能没有从运行到运行的固定地址;共享库中的函数需要能够放在内存中的任何位置以避免冲突。