如何重定向 LUA 中的所有类调用?

发布于 2025-01-10 16:56:35 字数 653 浏览 0 评论 0原文

好吧,我对此不太擅长,所以我将首先给出一个简单的例子来解释:

假设我有一个“类”,让其命名为 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

这只是一个简单的示例,但我需要对类中的所有可能函数执行相同的操作。就像调用 MyClassObject 上的任何函数一样,应该在执行该函数之前执行一些代码。

这可能吗?如果是这样,我该怎么做?

Ok i'm kinda bad at this so i'll explain by giving a simple example first:

Say i have a "class", lets name it MyClass, lets say it has a function named MyFunction, we can access this by calling the function from any MyClass objects like MyClassObject:MyFunction().

If i didn't have access to that function, and wanted to add a new behaviour that executes beforehand, i can do something like:

MyClass.OriginalMyFunction = MyClass.MyFunction -- store old function

function MyClass:MyFunction(args)
    --Do something beforehand
    MyClass:OriginalMyFunction(args) --call original function with same args
end

This was just a simple example, but what i need is doing the same for all possible functions in a class. As in calling any functions on MyClassObject should execute some code before executing that function.

Is this possible? If so, how do i do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绮烟 2025-01-17 16:56:35

这是一个继承示例,其中一些代码添加到所有函数中:

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

here is an inheritance example where some code is added to all your functions:

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)

result:

bar arg1 arg2
inherit:
bar arg1 arg2
value
value
您的好友蓝忘机已上羡 2025-01-17 16:56:35

它可以通过元表来完成,

有点粗略的例子:

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())

it can be done via metatables

somewhat crude example:

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())
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文