后挂机功能,后处理,并通过所有的回报(Post-hook a function, post-proc

2019-07-30 23:58发布

我有收到一些数据本身,参考其他功能和参数在任意函数的挂钩后功能... 。 这个函数引用函数返回后一些后期处理。 为简单起见,让我们只注意时间:

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

然而,这两个方案将引入一些开销,这是不可取的,考虑到迭代和应用程序的实时性的高量。 有什么简单?

Answer 1:

你不需要关闭。 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

你仍然得到一个额外的函数调用的开销,但是这不是创建一个封闭或一张桌子和远远低于你的前/后处理的开销更好。



文章来源: Post-hook a function, post-process and pass through all returns