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

3
我在Lua中重新定义了一个打印函数。
local myThing = PrintThing
function PrintThing (text)

    ... some code ...

    return myThing(text)

end

这个函数在我的本地脚本中可以工作

但是在其他脚本中却不能

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


直到脚本被执行,包括对全局变量的赋值在内,才会发生任何事情。执行脚本是它产生影响的唯一方式。大概,PrintThing 是一个全局变量。你的脚本将把它分配给函数,当你的脚本运行时产生。你是否在希望其产生影响的其他脚本之前执行了你的脚本? - Tom Blodget
@TomBlodget 是的,它总是首先执行,我也将其命名为“0 Script”,以便它在列表中首先运行。我看到其他人通过他们的脚本阻止了此“PrintThing”函数的执行,并只要求我们在名称中运行它们的脚本,以便它在列表中首先运行。所以是的,其他人正在这样做,但我无法弄清楚如何做到这一点 :( - Vladimir
3个回答

4
通常情况下是不能的。最好的办法是在全局环境中重新定义函数(_G.PrintThing=...)。但即使这样也不总是可行的。例如,主机应用程序在沙箱中运行您的代码,并且不提供访问全局环境的权限。在这种情况下,您需要创建一个C模块来获取对全局环境的访问权(但我认为沙箱环境不允许加载此类模块)。 第二种方法是 - 在您的环境中设置该函数。如果您在相同的环境中加载新模块,则只需在加载库之前重新定义函数即可。 如果尝试在加载模块后重新定义函数,则该函数将依赖于模块本身。例如,如果使用local PrintThing = PrintThing,则加载后它将无法看到您的新功能。 此外,C代码可以直接使用C函数。

0
如何在全局范围内重新定义打印函数?
修改Lua源代码并构建自己的解释器。
`print`被定义在Lua源代码中。重新定义它的唯一方法是运行类似于您所展示的代码。

谢谢,这不是Lua的默认“print”函数,而是用于游戏作弊软件的实际函数名称为“PrintChat”,您的答案仍然适用吗?因为我看到其他人只使用脚本就可以防止此函数运行。 - Vladimir

0

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

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

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

另外:许多基于插件的框架都有加载全局lua文件的能力,在这种情况下,你需要找出是否存在类似于此的东西。

据我所知,创建一个覆盖该函数的文件放在libs文件夹中应该适用于你的情况。

如果你正在使用我认为你正在使用的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接