2013-06-15 7 views
7

パラメータのデフォルト値が別のパラメータをどのように参照できますか?それができない場合は、どうすれば回避できますか?パラメータのデフォルト値が別のパラメータをどのように参照できますか?

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

答えて

11

これにより、複数のパラメータ・リストを使用している必要があります

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

デフォルト値はリストの前にパラメータを参照することができます。

彼らの平等だけので、アカウントに最初のパラメータリストがかかるため、しかしケースクラスには注意してください:

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

ニースの答え。これは、ケースクラスを使用するときにはかなり問題になりますが、2.11.6ではまだ修正されていません。 –

+0

実際には、等価性とハッシュに関与しないパラメータを定義することは有用な機能だと私は考えています。 –

6

それはcasenessを維持するためにどのように明白でなければ、あなたは、回避策を求めたので、 :

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) 
+0

私はこのメソッドがより有用であることを知っていますが、より一般的に思われるので、私は0 __の答えに受け入れを与えています。 –

+0

実際には、緑色のチェックは問題の解決方法を意味するはずですが、それを定義します。しかし、私は2、3年前にあなたの問題を解決したと思います。 –

+0

ええ、振り返ってみると、なぜ私が緑色の小切手を交換したのかわかりません。 –

関連する問題