覆盖 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()
是如何工作的——通过将字符串本身作为第一个参数传递!
我试图通过在函数的开头或结尾添加代码来更改 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()
是如何工作的——通过将字符串本身作为第一个参数传递!