2016-11-18 3 views
2

私はケースクラスでコピーを使いたいです。しかし、スカラは、私は第2パラントで宣言されたすべてのプロパティを指定しなければならないと主張しています。スカラのケースクラス:非等価/ハッシュコードのメンバーをコピー

例:

package academic.classes.casec.copy 

object TstClz { 
    val f = DataMe("SD") ("B") 
    val x = f.copy("x 4")()//Error : not enough arguments for method copy: (b: String, c: String)academic.classes.casec.copy.DataMe. Unspecified value parameters b, c. 
} 

case class DataMe (a : String, a1 : String = "a1")(b:String, c: String = ""){} 

これは、機能やバグですか?私はそれが私が望むように動作させるために何をすることができます(コピーインスタンスからa、b及びcの値が行われている取得

+1

カレー化されたケースクラスコンストラクタを使用する理由は何ですか? – Max

+0

私は 'copy'は(後続の引数リストから)コンストラクタのデフォルト引数を継承しないので、すべての引数を渡すか、コンストラクタの1つの引数リストに入れなければならないと思います。 – laughedelic

答えて

2

これは動作するようです:?

object TstClz { 
    val f = DataMe("SD") ("B") 
    val x = f.copy("x 4")(b = f.b, c = f.c) 
} 

case class DataMe (a : String, a1 : String = "a1")(val b:String, val c: String = "") {} 

のみb = f.b, c = f.cを追加するではありませんデフォルトではvalとマークされていないので、copyは2つの引数を持つ関数を返すものとして定義されているようですが、デフォルト値はありません彼らのために。

注:私はテストこれを2.11.8と2.12.0の両方で編集しました。

コピーのみSI-5009のように、第1パラメータリストにデフォルト値を持っている:私は、コミットにこのソースコメントがあるとして、彼の答えで参照the commit fxlaeは、完全に動作を元に戻すなかったと思います。

(コミットは2.12.0にあるとマークされています)。あなたがあなたのコメントに書いたように好適な場合には、すべてのval sが彼らのデフォルト値を持つように

、あなたは、あなた自身のコピーの実装を追加することができます。

def copy(a: String = a, a1: String = a1, b: String = b, c: String = c): DataMe = { 
    DataMe(a, a1)(b, c) 
} 
+0

これは少なくとも回避策です。たぶん、インスタンスを取ってこのように自分自身をコピーする自分自身のfnを作成します – tgkprog

4

が、私はそれが可能だとは思いません。 thisバグレポートには、次の文を見つけることができます。

マーティンは言う:ケースクラスネスは、唯一の残りの部分はコピーされるべきではない最初の引数リストに

を授けています。

その後、二番目のパラメータのリストを表す少なくとも機能を返すようにcopyをしたが、その振る舞いは、このcommitに戻った"bug fix"がありました。

+0

ありがとうございました。私はそれが機能だと思っていた。他のふるまいを別の機能として欲しいというフラグを立てることができたら幸いです。 – tgkprog