如何在全球范围内重新定义LUA功能

时间:2016-05-20 18:52:34

标签: lua

我在Lua中重新定义了打印功能

local myThing = PrintThing
function PrintThing (text)

    ... some code ...

    return myThing(text)

end

适用于我的本地脚本

但不在其他剧本中

如何全局重新定义此打印功能?

3 个答案:

答案 0 :(得分:2)

一般来说,你不能。在最好的情况下,您可以在全局环境中重新定义函数(_G.PrintThing=...)。但即使这并不总是允许的。例如。主机应用程序在沙箱中运行您的代码,并且不提供对全局环境的访问。在这种情况下,你必须让C模块访问全局env(但我不认为沙盒env允许加载这样的模块)。 第二个varian是 - 在您的环境中设置此功能。如果您在同一个环境中加载新模块,那么在加载库之前只需要重新定义函数。 如果在加载模块后尝试重新定义函数,则将取决于模块本身。例如如果使用local PrintThing = PrintThing,加载后将无法看到您的新功能。 C代码也可以直接使用C函数。

答案 1 :(得分:0)

  

如何全局重新定义此打印功能?

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

print在Lua源中定义。将其重新定义为运行时的唯一方法是运行类似于您所显示的代码。

答案 2 :(得分:0)

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

意味着全局重载是不可能的,除非你要修改程序(并且你可能无法访问源代码,如果它是一个黑客/脚本框架,加上它可能会被混淆)。

然而,您通常可以做的是,创建一个文件,该文件会重载该函数并将其包含在每个文件的开头,从而创建一个新状态。

此外:许多基于插件的框架都能够加载全局lua文件,在这种情况下,您需要找出是否存在类似这样的内容。

据我所知,在libs文件夹中创建一个文件,覆盖该函数应该适合你。

如果您正在使用,我认为您正在使用。