【问题标题】:How to redefine a LUA function globally如何在全局范围内重新定义 LUA 函数
【发布时间】:2016-05-29 17:24:29
【问题描述】:

我在 Lua 中重新定义了一个 Print 函数

local myThing = PrintThing
function PrintThing (text)

    ... some code ...

    return myThing(text)

end

它适用于我的本地脚本

但不是在其他脚本中

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

【问题讨论】:

  • 在执行脚本之前,什么都不会发生——包括分配给全局变量。执行你的脚本是它产生效果的唯一方法。据推测,PrintThing 是一个全局变量。您的脚本会将其分配给脚本运行时生成的函数。您是否在您希望影响的其他脚本之前执行了您的脚本?
  • @TomBlodget 是的,它总是首先执行,我也将它命名为0 Script,所以它首先在列表中运行,我看到其他人通过他们的脚本阻止执行​​这个PrintThing 函数并且只要求我们以名称 0 运行他们的脚本,因此它在列表中首先运行。所以是的,其他人正在这样做,但我不知道怎么做:(

标签: lua


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,这不是Lua默认的print函数,它是一个游戏破解软件,函数的实际名称是PrintChat,你的答案仍然适用吗?因为我见过其他人阻止这个函数只用一个脚本运行
    【解决方案3】:

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

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

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

    另外:许多基于插件的框架都能够加载全局 lua 文件,在这种情况下,您需要确定是否存在类似的东西。

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

    如果你正在使用,我认为你正在使用什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-31
      • 2017-03-05
      • 1970-01-01
      • 2012-07-05
      • 2019-01-25
      • 1970-01-01
      • 2013-12-12
      • 2017-01-20
      相关资源
      最近更新 更多