下面的代码不编译。期望的是在隐式类中有一个按名称调用构造函数参数,如下所示,
def f(n: Int) = (1 to n) product
implicit class RichElapsed[A](val f: => A) extends AnyVal {
def elapsed(): (A, Double) = {
val start = System.nanoTime()
val res = f
val end = System.nanoTime()
(res, (end-start)/1e6)
}
}
哪里有电话
val (res, time) = f(3).elapsed
res: Int = 6
time: Double = 123.0
REPL 中报告此错误,
<console>:1: error: `val' parameters may not be call-by-name
implicit class RichElapsed[A](val f: => A) extends AnyVal {
因此要问如何RichElapsed
类可以被重构。
提前致谢。
Peter Schmitz 的解决方案就是简单地放弃val
(伴随着扭转的希望RichElapsed
到一个值类)当然是最简单且侵入性最小的事情。
如果你真的觉得你需要一个值类,另一种选择是:
class RichElapsed[A](val f: () => A) extends AnyVal {
def elapsed(): (A, Double) = {
val start = System.nanoTime()
val res = f()
val end = System.nanoTime()
(res, (end-start)/1e6)
}
}
implicit def toRichElapsed[A]( f: => A ) = new RichElapsed[A](() => f )
请注意,虽然使用上面的值类允许删除临时的实例化RichElapsed
例如,仍然有一些包装正在进行(无论是我的解决方案还是彼得施密茨的解决方案)。
也就是说,主体通过名称传递为f
被包装到一个函数实例中(在 Peter Schmitz 的例子中,这在代码中并不明显,但无论如何都会在幕后发生)。
如果您也想删除这种包装,我相信唯一的解决方案是使用宏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)