Scala中的Thunk包装方法

Scala中的Thunk包装方法,scala,Scala,我的类中有几个方法,每个方法接受不同的参数并返回不同的参数。对于这些方法中的每一种,我都希望将它们封装在一段通用代码中,以便进行一些时间记录。例如,当方法开始时,它记录开始时间,当它结束时,它记录结束时间等等 我已实施此方法: def withTimerMetrics(fn: => _) = { Try(AppMetrics.timer.time()).map(context => { fn context.close() }) } 其中

我的类中有几个方法,每个方法接受不同的参数并返回不同的参数。对于这些方法中的每一种,我都希望将它们封装在一段通用代码中,以便进行一些时间记录。例如,当方法开始时,它记录开始时间,当它结束时,它记录结束时间等等

我已实施此方法:

def withTimerMetrics(fn: => _) = {
    Try(AppMetrics.timer.time()).map(context => {
      fn
      context.close()
    })
  }
其中fn是在我的类中实现的方法之一


显然,我得到了一个未绑定的通配符错误。我有办法做到这一点吗?我不想为此使用Scala宏。还有其他想法吗?

您有错误的方法签名。试试这个:

def withTimerMetrics[T](fn: => T) = {
  Try(AppMetrics.timer.time()).map(context => {
    fn
    context.close()
  })
}
不确定,为什么要在
Try
中包装
time()
(是codahale度量吗?),因为现在如果不更改输出,就无法对函数进行计时。我认为应该是这样的:

def withTimerMetrics[T](fn: => T): T = {
  val c = AppMetrics.timer.time()
  try {
    fn
  } finally {
    context.close()
  }
}

因此,您可以在不改变应用程序逻辑的情况下测量执行时间。

什么是
AppMetrics
,为什么
timer.time()
会在下一个
map
中输出您调用的可关闭
上下文
?您试图实现什么?是否为您的函数提供某种装饰器(包装器)来记录前后的时间?您可以用
AnyRef
替换
,以便捕获所有函数。