1

我有一个 post-hook 函数,它自己接收一些数据,引用另一个函数和.... 在引用的函数返回后,此函数会进行一些后处理。为简单起见,我们只记下时间:

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

由于我需要后处理,我不能立即return func(...),我不知道会有多少退货。完成后处理后,如何通过这些退货?

到目前为止,我只能考虑打包调用,local results = { func(...) }然后使用return unpack(results)或制作一个后处理器工厂,该工厂将生成后处理闭包,并将所有必要的数据作为上值:

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

然而,考虑到大量的迭代和应用程序的实时性,这两种方法都会引入一些不希望的开销。有没有更简单的?

4

1 回答 1

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

您仍然会获得额外函数调用的开销,但这比创建闭包或表要好,而且远低于前/后处理的开销。

于 2012-08-14T22:05:15.700 回答