如何在全局重新定义LUA函数

我已经在Lua中重新定义了Print函数

local myThing = PrintThing
function PrintThing (text)

    ... 一些代码 ...

    return myThing(text)

end

它可以用于我的本地脚本

但对于其他脚本则不起作用

如何在全局范围内重新定义此打印函数?

点赞
用户501459
用户501459

如何在全局重新定义 print 函数?

修改 Lua 源代码并构建自己的解释器。

print 函数是在 Lua 源代码中定义的。要在运行时重新定义它的唯一方法是运行类似于你所展示的代码。

2016-05-20 19:07:38
用户2328287
用户2328287

一般来说,你不能使用原有方式重新定义一个函数,只有在全局环境下可以这样做( _G.PrintThing=...)。但即使如此,有时也是不允许的。例如,主机应用程序在沙箱中运行你的代码,不提供对全局环境的访问。在这种情况下,你必须制作 C 模块才能访问全局环境(但我不认为受沙箱限制的环境允许加载这样的模块)。

第二种方法是将此函数设置在你的环境中。如果你在同一环境中加载新模块,那么在加载库之前,你只需要重新定义函数即可。

如果在加载模块之后尝试重新定义函数,则该函数将依赖于模块本身。例如,如果使用 local PrintThing = PrintThing,它在加载后将不会看到你的新函数。

另外,C 代码可以直接使用 C 函数。

2016-05-23 11:43:50
用户3855642
用户3855642

你的软件可能会为每个加载的脚本文件创建一个新的状态,以避免不同“插件”之间的冲突。

这意味着在全局范围内进行重载是不可能的,除非你要修改程序(如果它是一个黑客/脚本框架,那么你可能无法访问源代码,同时它也很可能被混淆)。

但是你通常可以创建一个文件,用来重载该函数并将其包含在创建新状态的每个文件的开头。

另外:许多基于插件的框架都有加载全局lua文件的功能,这种情况下你需要找出你的软件是否具有此功能。

根据我的理解,创建一个文件覆盖该函数并放置在 libs 文件夹中应该对你有效。

如果你正在使用我所想象的那个软件。

2016-05-29 09:03:32