我有这个计时器对象:
object Timed {
def apply[T](fn: => T)(implicit logger: Logger): T =
measureDuration(Thread.currentThread().getStackTrace.last.getMethodName, TimeUnit.MILLISECONDS, fn, logger)
}
我想要这样(在另一个class
中):
def test(): Unit = {
implicit val logger: Logger = LoggerFactory.getLogger("testTimed")
Timed { someFunction() }
}
AND - 我想恢复"someFunction"
中的字符串Timed.apply
以传递而不是堆栈的最后一个方法的名称。这甚至可能吗?
我试着看看宏,但很快就迷路了。我认为这将是一个挑战。有什么想法吗?
更多详情:
在Timer.apply
内,我们只有fn
,但是当我们写Timed { someFunction() }
时,有一个函数名称:someFunction
- 该字符串("someFunction"
)是我想要恢复和打印出来的东西。
对于Timed { 2 + 2 }
或Timed { x }
这样的情况:我们可以假设按照惯例,用户会在代码审核中调用Timed("addition") { 2 + 2 }
和Timed { x }
。换句话说,我只对Timed { someFunction() }
感兴趣。
答案 0 :(得分:1)
除了搞乱宏之外,在Timed.apply
中获取函数名的最佳方法是将其作为参数传递。如,
Timed("someFunction")(someFunction)