后处理一个函数,后处理并传递所有的返回值

我有一个 post-hook 函数,它接收一些数据,另一个函数的引用和 ... 中传递给该任意函数的参数。该函数在引用的函数返回后进行一些后处理。为简单起见,让我们只注意时间:

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

由于我需要后处理,我不能立即 return func(...),而且我不知道事先会有多少返回。完成后处理后,我如何执行这些返回?

到目前为止,我只能考虑将调用打包在 local results = { func(...) } 中,然后使用 return unpack(results) 或创建一个 postprocessor 工厂,该工厂会生成带有所有必要数据的 postprocessing 闭包作为 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

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

点赞
用户501459
用户501459

你不需要闭包。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-14 22:05:15