我有这样的课:
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/