3

パターン マッチングを行う既存のコードに影響を与えないように、コンストラクター パラメーターをデフォルト値で追加したい既存のケース クラスがありますが、正しいアプローチがわかりません。

すなわち。私は持っている:

case class Foo(a: Int, b: Int)

def bar(n: Foo) = n match {
  case Foo(1, 2) => true
  case _ => false
}

ここで、追加のパラメーター c を Foo に追加する必要があるとします。すなわち。

case class Foo(a: Int, b: Int, c: Boolean = true)

既存のすべてのユース ケースで、パラメーターcは true になるため、そのデフォルト値が設定されます。ただし、一部の新しいユース ケースでは、これに false を渡す必要があります。

そのため、別のパラメーターを追加して、デフォルト値を にするのが賢明なようですtrue。しかし、これを行うとすぐに、パターン マッチbarが構文エラーになります。= true既存のコンストラクター呼び出しを変更する必要がないようにデフォルトを追加したため、これは間違っているようです。

これを行うにはどうすればよいでしょうか?古いパターン マッチを変更せずに残しますか?

更新: Foo の既存のインスタンス化をすべて書き直す必要もありません。@som-snytt は、別のパラメーターを として追加できることを指摘しましたFoo(a: Int, b: Int)(c: Boolean = true)。これは、失敗などの既存の呼び出しを引き起こすことを除いて完璧ですFoo(1,2)(それらは として書き換える必要がありますFoo(1,2)())。一部のユースケースにのみ新しいパラメーターを追加し、他の場所で機能するデフォルトを設定して書き換えを回避する方法を探しています。

4

2 に答える 2

2

構文は、case Fooコンストラクターではなく、unapplyonと呼ばれるメソッドを呼び出していobject Fooます。case クラスは、コンパニオン オブジェクトや unapply を含むさまざまなボイラープレートを自動生成します。

unapplyパラメータは 1 つだけで、オブジェクトが一致します。Java/Scala では戻り値をオーバーロードできないため、これによりオーバーロードを回避できます。

要するに、あなたが望むことを完全に行うことはできません。

ただし、別の名前のエクストラクタを作成することはできます。アンダースコアを追加した人は次のとおりです: http://x3ro.de/multiple-unapply-methods-for-pattern-matching-in-scala/

ただし、可能であれば、エクストラクタのバリアントにより意味のある名前を使用する方がよいでしょう。

すべてがどのように機能するかについての詳細は次のとおりです

ケースクラスが「手作業で」行うすべてのことを書き出して、別の unapply など別の方法で行うことはできますが、equals、hashCode、toString などを気にしていると仮定すると、かなり面倒です。そうすれば、既存のコードを変更する必要がなくなるかもしれませんが、その価値はないようです。

誰かが投稿した例を次に示します: https://gist.github.com/okapies/2814608

于 2013-06-01T06:11:03.037 に答える