我有一个后挂钩函数,它为自己接收一些数据,引用另一个函数和...
中任意函数的参数。在引用函数返回后,此函数执行一些后处理。为简单起见,我们只记下时间:
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
然而,考虑到大量的迭代和应用的实时性,这两种方法都会引入一些不合需要的开销。还有什么更简单的吗?
答案 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
你仍然需要额外函数调用的开销,但这比创建一个闭包或表更好,远远低于你的前/后处理的开销。