我如何重定向 LUA 中的所有 class 呼叫?
How do i redirect all class calls in LUA?
好吧,我不太擅长这个,所以我先举一个简单的例子来解释一下:
假设我有一个“class”,我们将其命名为 MyClass
,假设它有一个名为 MyFunction
的函数,我们可以通过从任何 MyClass
像 MyClassObject:MyFunction()
.
这样的对象
如果我无权访问该函数,并且想添加一个预先执行的新行为,我可以这样做:
MyClass.OriginalMyFunction = MyClass.MyFunction -- store old function
function MyClass:MyFunction(args)
--Do something beforehand
MyClass:OriginalMyFunction(args) --call original function with same args
end
这只是一个简单的示例,但我需要对 class 中所有可能的函数执行相同的操作。正如在 MyClassObject
上调用任何函数一样,应该在执行该函数之前执行一些代码。
这可能吗?如果可以,我该怎么做?
可以通过元表完成
有点粗略的例子:
local MyClass = {}
function MyClass:new()
local newObj = {
x = 0
}
self.__index = self
return setmetatable(newObj, self)
end
function MyClass:get_x()
print("hello from get_x")
return self.x
end
local HookedMyClass = {}
function HookedMyClass:new()
local t = MyClass:new()
local mt = {
__index = function(table, key)
print("hook")
return(MyClass[key])
end
}
return setmetatable(t, mt)
end
local hooked = HookedMyClass:new()
print(hooked:get_x())
这是一个继承示例,其中一些代码被添加到您的所有函数中:
function new (parent)
local child = {}
for k,v in pairs(parent) do
if type(v)=="function" then
child[k] = function(...)
print("inherit:")
return v(...)
end
else child[k] = v
end
end
return child
end
my_class = new(class)
class.bar("arg1","arg2")
my_class.bar("arg1","arg2")
print(class.a)
print(my_class.a)
结果:
bar arg1 arg2
inherit:
bar arg1 arg2
value
value
好吧,我不太擅长这个,所以我先举一个简单的例子来解释一下:
假设我有一个“class”,我们将其命名为 MyClass
,假设它有一个名为 MyFunction
的函数,我们可以通过从任何 MyClass
像 MyClassObject:MyFunction()
.
如果我无权访问该函数,并且想添加一个预先执行的新行为,我可以这样做:
MyClass.OriginalMyFunction = MyClass.MyFunction -- store old function
function MyClass:MyFunction(args)
--Do something beforehand
MyClass:OriginalMyFunction(args) --call original function with same args
end
这只是一个简单的示例,但我需要对 class 中所有可能的函数执行相同的操作。正如在 MyClassObject
上调用任何函数一样,应该在执行该函数之前执行一些代码。
这可能吗?如果可以,我该怎么做?
可以通过元表完成
有点粗略的例子:
local MyClass = {}
function MyClass:new()
local newObj = {
x = 0
}
self.__index = self
return setmetatable(newObj, self)
end
function MyClass:get_x()
print("hello from get_x")
return self.x
end
local HookedMyClass = {}
function HookedMyClass:new()
local t = MyClass:new()
local mt = {
__index = function(table, key)
print("hook")
return(MyClass[key])
end
}
return setmetatable(t, mt)
end
local hooked = HookedMyClass:new()
print(hooked:get_x())
这是一个继承示例,其中一些代码被添加到您的所有函数中:
function new (parent)
local child = {}
for k,v in pairs(parent) do
if type(v)=="function" then
child[k] = function(...)
print("inherit:")
return v(...)
end
else child[k] = v
end
end
return child
end
my_class = new(class)
class.bar("arg1","arg2")
my_class.bar("arg1","arg2")
print(class.a)
print(my_class.a)
结果:
bar arg1 arg2
inherit:
bar arg1 arg2
value
value