参数的默认值如何引用另一个参数?

时间:2013-06-15 16:36:45

标签: scala scala-2.10

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

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)
                                       ^

2 个答案:

答案 0 :(得分:19)

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

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

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

但是要小心使用case类,因为它们的相等性只会将第一个参数列表放入帐户中,因此:

A(1)() == A(1)(3)  // --> true!!

答案 1 :(得分: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)