16

一个参数的默认值如何引用另一个参数?如果不能,如何解决?

case class A(val x:Int, val y:Int = x*2)

错误(足够合理):

scala> case class B(val x:Int, val y:Int = x*2)
<console>:7: error: not found: value x
   case class B(val x:Int, val y:Int = x*2)
                                       ^
4

2 回答 2

22

这要求您使用多个参数列表:

case class A(x: Int)(y: Int = x*2)

默认值只能引用前面列表中的参数。

但是要小心 case 类,因为它们的相等性只考虑第一个参数列表,因此:

A(1)() == A(1)(3)  // --> true!!
于 2013-06-15T16:37:55.047 回答
10

由于您要求解决方法,如果不明显如何保持大小写:

scala> :pa
// Entering paste mode (ctrl-D to finish)

case class Foo(x: Int, y: Int)
object Foo {
  def apply(x: Int): Foo  = apply(x, 2*x)
}

// Exiting paste mode, now interpreting.

defined class Foo
defined object Foo

scala> Foo(5,6)
res45: Foo = Foo(5,6)

scala> Foo(5)
res46: Foo = Foo(5,10)
于 2013-06-15T19:07:42.717 回答