如何在Lua中修补或替换函数(同时具有还原功能)

我认为在代码中漏掉了什么,要么我的“伪代码”不正确,要么在 Lua 中没有通过引用传递函数。

我只想要一个允许我用另一个函数来修补/替换函数的小库,但是要能够将修补过的函数恢复到其原始函数。

也许,过去已经有人制作过这样的库(只是我找不到)。

我的当前代码:

 -[[
当用户想要将类型为“function”的变量的补丁/替换/分流等于另一个类型为“function”的变量时,我们应该始终首先检查用户的输入,即以下问题-用户是否提供了有效的参数。
如果捕获到无效的参数,则向用户抛出错误。
现在我们知道用户提供了有效的参数,接下来应该检查所提供的函数(要打补丁的函数)是否已经是打了补丁的函数,如果是则将错误抛回给用户。
现在,我们将提供的函数(要打补丁的函数)保存在全局表中(以允许用户稍后使用另一个函数来还原它)。
最后,我们将一个函数(要补丁的函数)分配给用户提供的第二个函数。

当用户想要还原原始函数时,我们应该再次检查用户的输入,即用户是否提供了一个函数,如果是-它是否真的被赋值了。
现在我们知道用户提供了有效的参数,因此通过在全局表中查找(保存原始函数的地方)来还原原始函数。
如果出现任何原始函数未找到的情况,只需向用户抛出错误。
此时,我们已经拥有了所有信息,将被修补的函数(来自用户的输入)分配给原始函数。
最后,进行清理,从全局表中删除原始函数信息(因为它不再是修补过的)。
--]]

ftbl = ftbl or {}

patchf = function(dest, src)
    assert(type(dest) == "function", "bad argument #1 (function expected, got " .. type(dest) .. ")")
    assert(type(src) == "function", "bad argument #2 (function expected, got " .. type(src) .. ")")
    assert(not ftbl[src], "destination is already patched/same source exists")
    ftbl[src] = dest
    dest = src
end

restoref = function(src)
    assert(type(src) == "function", "bad argument #1 (function expected, got " .. type(src) .. ")")
    assert(type(ftbl[src]) == "function", "source is not patched/source does not exists")
    fsrc = ftbl[src]
    ftbl[src] = nil
end

local my_function = function()
  print("Hello from my_function :D", 1)
end

local another_function = function()
  print("Hello from another_function D:", 2)
end

patchf(another_function, my_function)

another_function() -- Hello from another_function D:    2

正如您所看到的,它没有使用 my_function 来修补另一个函数。

点赞
用户5622901
用户5622901

有什么想法也能使其在本地函数(如当前代码所见)上工作吗?

你不需要一个库来替换另一个本地函数。只需要执行一个简单的赋值操作。

例如:

local fu = function()
    print "fu"
end

local fu_new = function()
    print "new fu"
end

fu()
fu, fu_new = fu_new, fu
fu()
fu, fu_new = fu_new, fu
fu()

将输出:

fu
new fu
fu
2015-12-03 22:47:39