隐式类中的Scala按名称调用构造函数参数

榆树

以下代码无法编译期望在隐式类中具有按名称调用的构造函数参数,如此处所示,

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重构类。

提前致谢。

里吉斯让吉尔(Regis Jean-Gilles)

彼得·施米茨(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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

隐式调用超类中的无参数构造函数

Scala中的隐式抽象类构造函数参数和继承

在Scala的构造函数中扩展具有隐式参数的类的惯用方式是什么?

Scala类构造函数中的隐式对象

在Scala函数中按名称调用参数

根据函数是否过载,Scala隐式转换按名称调用参数的工作方式有所不同

在函数中需要Scala隐式类

Scala隐式构造函数

Scala如何确定TreeSet构造函数的隐式类型参数

如何隐式调用父类的构造函数

为什么类中的ostringstream类型的成员导致“调用隐式删除的复制构造函数”错误?

在构造函数中调用this()隐式调用super()是真的吗?

隐式提取Scala函数名称和参数

Java调用Scala案例类W /隐式参数?

让隐式派生类构造函数调用基类构造函数

为什么构造函数将始终具有与类相同的名称,以及如何隐式调用它们?

C ++为什么基类/结构构造函数不能有多个参数可以从派生隐式调用?

与基类构造函数相比,何时调用Java隐式构造函数?

通过方法/构造函数参数隐式与隐式使用

调用隐式删除的默认构造函数

隐式调用复制构造函数?

Scala中的隐式类

在Scala中,元组语法是语言本身的一部分,还是对TupleN的隐式构造函数调用?

Scala:在对象或类中定义隐式函数

如何在Python类函数中隐式传递参数

C++在初始化类实例时隐式调用类成员的构造函数

Java中的每个构造函数都会隐式调用Object的构造函数吗?

Scala case类禁止按名称调用参数?

Scala中具有隐式函数的转换与隐式类之间的区别