lua - 重写Lua实例函数

标签 lua overriding

我正在尝试通过在 Lua 函数的开头或结尾添加代码来更改其行为。因为这是游戏的模组,所以我无法直接编辑该功能,所以我必须重写它。我通过在局部变量中存储对原始函数的引用,然后用我自己的函数重新定义该函数来实现此目的,该函数调用原始函数以及我需要添加的任何前缀或后缀代码,如下所示:

local base_exampleFunction = ExampleBaseGameClass.exampleFunction

function ExampleBaseGameClass.exampleFunction(param1, param2)

    --Prefix code goes here

    base_exampleFunction(param1, param2);

    --Postfix code goes here
    
end

这对于使用 ClassName.functionName 语法定义的函数来说效果很好,但有些函数使用 ClassName:functionName 相反,根据我的理解,这些函数将类实例的引用作为第一个参数传递。我不知道如何为这些函数添加前缀/后缀,因为如果我尝试相同的方法,在声明变量来保存原始函数时会出现以下错误:

尝试索引:example非表函数:null

有办法实现这个功能吗?

最佳答案

: 函数只是表达“第一个参数是 self”的可怕方式。

因此,ExampleBaseGameClass:exampleFunction(param2) 相当于 ExampleBaseGameClass:exampleFunction(ExampleBaseGameClass, param2)!它只是以 self 开头,并且使用 : 声明的函数将会突然出现一个不可见的 self 变量。

local a = {}
function a.b(self)
    print(self)
end
function a:c()
    print(self)
end

-- a.c(a) == a:c()
-- a:b() == a.b(a)
-- a:b() == a:c()

利用这个想法,我们可以简单地在前面添加一个参数(它不必称为“self”,它只需是第一个参数)。

这个应该可以工作,除非你的Lua环境中有一部分(例如,时髦的元表)会阻止这样的事情发生:

local base_exampleFunction = ExampleBaseGameClass.exampleFunction

function ExampleBaseGameClass.exampleFunction(self, param1, param2)

    --Prefix code goes here

    base_exampleFunction(self, param1, param2);

    --Postfix code goes here
    
end

lua 库利用第一个参数作为其字符串库的调用对象。请注意 ("hello"):gsub() 的工作原理 - 将字符串本身作为第一个参数传递!

关于lua - 重写Lua实例函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71973005/

相关文章:

java - Java 的@OverridingMethodMustCallSuper 发生了什么?

c++ - MFC 中的 OnKillFocus() 覆盖在奇数时间触发

java - 为什么我在下面的代码中没有收到任何错误?

c++ - 表作为从 Lua 调用的 C 函数中的参数

c - 从 Lua 调用的推送表的 C 函数应该返回什么?

java - 在java中覆盖具有不同返回类型的方法?

html - 覆盖 slider 背景的 CSS 值

database - Redis 的 Lua 脚本,它对键的值求和

lua - 动态命名 lua 对象

lua - Lua 语言中 switch 语句的替代方法是什么?