2016-05-20 39 views
1

我重新定义了打印功能在Lua如何重新定义一个LUA功能全局

local myThing = PrintThing 
function PrintThing (text) 

    ... some code ... 

    return myThing(text) 

end 

它适合我的地方脚本其他脚本

但不是

如何重新定义这个打印功能全球范围内?

+0

没有任何反应 - 包括分配给全局变量 - 直到执行脚本。执行脚本是获得效果的唯一方法。据推测,PrintThing是一个全局变量。你的脚本会将它分配给脚本运行时产生的函数。你有没有在你希望有效的其他脚本之前执行脚本? –

+0

@TomBlodget是的,它总是首先执行,我也将它命名为'0 Script',因此它首先在列表中运行,我已经看到其他人通过脚本阻止执行​​此'PrintThing'函数,并且只让我们运行他们的脚本的名字是0,所以它首先在列表中运行。所以是别人都这样做,但我不知道如何:( – Vladimir

回答

2

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

+0

谢谢,'_G.PrintThing ='工作得很好 – Vladimir

0

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

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

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

+0

谢谢,这不是默认的'打印'功能的Lua,它是一个游戏黑客软件和功能的实际名称是'PrintChat',仍然你的答案适用?因为我见过其他人阻止这个函数只运行脚本 – Vladimir

0

您的软件可能会为其加载的每个脚本文件创建一个新状态,以避免不同“插件”之间的冲突。除非你打算修改程序(如果是黑客/脚本框架,再加上它可能会被混淆,你可能无法访问源代码),所以不可能在全局范围内重载它。

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

另外:这些基于插件的框架中的很多都可以加载全局lua文件,在这种情况下,您需要确定是否存在类似这样的事情。

对于我所知道的,在libs文件夹内创建一个覆盖该函数的文件应该适合您。

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