我正在尝试通过在 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/