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

Dom*_*kis 13 scala scala-2.10

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

case class A(val x:Int, val y:Int = x*2)
Run Code Online (Sandbox Code Playgroud)

错误(合理地):

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)
                                       ^
Run Code Online (Sandbox Code Playgroud)

0__*_*0__ 19

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

case class A(x: Int)(y: Int = x*2)
Run Code Online (Sandbox Code Playgroud)

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

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

A(1)() == A(1)(3)  // --> true!!
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.这在使用案例类时非常困难,而且从2.11.6开始仍然没有修复. (2认同)
  • 实际上,我认为能够定义不参与相等和散列的参数是一个有用的功能。 (2认同)

som*_*ytt 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)
Run Code Online (Sandbox Code Playgroud)