覆盖 Lua 实例函数

Override Lua instance function

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

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 代替,据我所知,这些函数是传递对 class 的引用的函数实例作为第一个参数。我不知道如何 prefix/postfix 这些函数,因为如果我尝试相同的方法,在声明一个变量来保存原始函数时会出现以下错误:

attempted index: exampleFunction of non-table: 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() 是如何工作的——通过将字符串本身作为第一个参数传递!