以下代码无法编译。期望在隐式类中具有按名称调用的构造函数参数,如此处所示,
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
实例的实例化,但仍然存在一些包装操作(包括我的解决方案和Peter Schmitz的解决方案)。即,按名称传递的主体f
被包装到一个函数实例中(在Peter Schmitz的情况下,这在代码中并不明显,但无论如何都将在幕后发生)。如果您也想删除此包装,我相信唯一的解决方案是使用宏。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句