scala:构造函数区分应用和隐式参数吗?

标签 scala

我有这样的课:

class A(arg: Int)(implicit i: Boolean) {
  def apply(v: Double): this.type = {
    // do stuff
    this
  }
}

我想通过在同一行初始化和调用 apply 来创建它的一个实例:

implicit val i = false
val a = A(arg=1)(v=2.0) // doesn't work
val a2 = (A(arg=1))(v=2.0) // doesn't work

不幸的是,编译器假定 v=2.0 用于隐式参数,而不是用于 apply()。我尝试了多种插入 {} 和 () 的不同语法,但都没有奏效。我意识到 v 可以移动到构造函数中,但在我的情况下,这不是一个选项,因为 A 是子类,我不想将 v 添加到每个子类构造函数中。有没有办法做到这一点?谢谢。

最佳答案

“丑陋但似乎有效”怎么样......

class A(arg: Int)(implicit i: Boolean) {
  def apply(v: Double): this.type = this
}
implicit val i = false
// removing the :A makes this fail to run on simplyscala
val a1 = (new A(arg=1) : A)(v=2.0)
// also works with explicit method name
val a2 = new A(arg=1).apply(v=2.0)
// and works without implicit being ... implicitized
val a = new A(arg=1)(i)(v=2.0)

老实说,不知道 :-) 但是,考虑一下这可能是一些见解:

val a = (new A(arg=1))(2.0)
error: type mismatch;
 found   : Double(2.0)
 required: Boolean
       val a = (new A(arg=1))(2.0)

哇!

编码愉快。

关于scala:构造函数区分应用和隐式参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069232/

相关文章:

generics - 未知类型的最小值/最大值

scala - Actor "queue"?

eclipse - 在 eclipse Spark scala 调试 session 中,在哪里可以找到 RDD 中的数据?

scala - scala 编译器对类型系统内的单元类型有什么特殊的规则

swing - 如何使用 SuperMixin 创建 Scala swing 包装类?

Scala:访问Either的公共(public)子类型

scala - 找不到 org.scalacheck.Arbitrary 类型的证据参数的隐式值

scala - 带大小写和不带大小写的 zipWithIndex

java - 基于案例对象的参数

scala - 字符串相同但行为不同 : File strings don't work with spark if they are from an HDFS file