挂钩函数,后处理并传递所有返回

时间:2012-08-14 21:59:06

标签: lua hook return post-processing

我有一个后挂钩函数,它为自己接收一些数据,引用另一个函数和...中任意函数的参数。在引用函数返回后,此函数执行一些后处理。为简单起见,我们只记下时间:

function passthrough(tag, func, ...)
    metric1[tag] = os.time()
    func(...)
    metric2[tag] = os.time()
end

由于我需要进行后处理,我不能立即return func(...)而且我事先并不知道会有多少回报。在完成后期处理后,我怎样才能通过这些回报?

到目前为止,我只能考虑在local results = { func(...) }中进行打包调用,然后使用return unpack(results)或者创建一个后处理工厂来生成后处理闭包,并将所有必要的数据作为upvalues:

local function generate_postprocessor(tag)
    return function(...)
        metric2[tag] = os.time()
        return ...
    end
end

function passthrough2(tag, func, ...)
    metric1[tag] = os.time()
    return generate_postprocessor(tag)(func(...))
end

然而,考虑到大量的迭代和应用的实时性,这两种方法都会引入一些不合需要的开销。还有什么更简单的吗?

1 个答案:

答案 0 :(得分:2)

你不需要关闭。无论如何,在调用闭包生成器之前调用func。你只需要一个函数将其参数直接传递给它的返回值,为你的第二个标记提供一个钩点:

function passthrough_return(tag, ...)
    metric2[tag] = os.time()
    return ...
end

function passthrough(tag, func, ...)
    metric1[tag] = os.time()
    return passthrough_return(tag, func(...))
end

你仍然需要额外函数调用的开销,但这比创建一个闭包或表更好,远远低于你的前/后处理的开销。