自分自身のデータ、別の関数への参照、およびの任意の関数の引数を受け取るポストフック関数があります...
。この関数は、参照された関数が戻った後、後処理を行います。簡単にするために、時間をメモしてみましょう。
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
ただし、これらのアプローチはどちらも、大量の反復とアプリケーションのリアルタイム性を考慮すると、望ましくないオーバーヘッドをもたらします。もっと簡単なものはありますか?