lua后置钩子函数的挂钩。

我找到一个关于 post hooking 的主题,但我不认为它和我想要完成的相同。我找到的主题

我需要的是以下内容:

local someBoolean = false
function doSomething() -- 这是代理表中 __index 使用的函数
   someBoolean = true
   return aFunction -- 这是我们不能更改的函数
end

我需要能够在 return 之后运行“someBoolean = false”的代码...(是的,我知道这不应该发生:p)考虑到 aFunction 可能包含其他函数本身,我希望 someBoolean 对于 aFunction 的整个范围都为 true,但之后,它必须被转换回 false

如果我没有解释清楚,我很抱歉。复制我的实际项目的相关代码将会太大,并且我不想浪费你的时间。 我已经被困在这个问题上了一段时间,但似乎无法解决...

(编辑:我不能只在函数后面放置 someBoolean = false,因为函数实际上是代理表中的一个 __index 函数)

编辑:相关代码片段。我希望这有点清楚

local function objectProxyDelegate(t, key)
  if not done then  -- 当我们的对象完全初始化时,done = true
     return cls[key]   -- cls 是类,newinst 是新实例(duh...)
  end
  print("trying to delegate " .. key)
  if accessTable.public[key] then
     print(key .. " passed the test")
     objectScope = true
     if accessTable.static[key] then -- 静态函数。返回静态函数
        return cls[key]   -- 我们需要以某种方式在此之后将 objectScope 设置回 false,否则我们将继续覆盖受保护/私有函数
     else
        return newinst[key]
     end
  elseif objectScope then
     print("overridden protected/private")
     return cls[key]
  end
  if accessTable.private[key] then
     error ("This function is not visible. (private)", 2)
  elseif accessTable.protected[key] then
     error ("This function is not visible to an instance. (protected)", 2)
  else
     error ("The function " .. key .. " doesn't exiist in " .. newinst:getType(), 2)                      -- den deze...
  end
end
点赞
用户734069
用户734069

你不能在 return 语句之后执行代码。正确的答案是调用函数,捕获返回值,设置变量,然后返回返回值。例如:

local someBoolean = false
function doSomething(...) -- 这是代理表中 __index 使用的函数
  someBoolean = true
  local rets = { aFunction(...) } -- 这是我们无法更改的函数
  someBoolean = false
  return table.unpack(rets)
end
2012-08-23 00:27:18
用户221955
用户221955

由于需要返回一个函数(而不是对函数进行求值),因此可以为aFunction创建一个代理,并返回该代理。下面是实现方法(其中包含了Nicol Bolas的解决方案中的一些代码):

local someBoolean = false

function doSomething(...) -- 这是在代理表中使用__index的函数
  someBoolean = true

  -- 返回代理函数而不是aFunction
  return function(...)
    local rets = { aFunction(...) }
    someBoolean = false
    return table.unpack(rets)
  end
end
2012-08-23 03:44:56