3

コンストラクターのパラメーターの非常に長いリストを持つクラスがあります。

case class ClassA(a: Int, b: String, c: Int /*and so on*/)

私はそれに対してパターンマッチングを行う必要があります:

val cls = getClassA
cls match {
  case ClassA(a, _, _, _, _, /* and so on */) => Some(a)
  case ClassA(_, _, c, _, _, /* and so on */) => Some(c)
  case _ => None
}

そして、aorの値を取得する必要がありますc_本当に必要ない場合、他のすべてのパラメーターを指定しないことは可能ですか?

val cls = getClassA
    cls match {
      case ClassA(a, _*) => Some(a)
      case ClassA(_, _, c, _*) => Some(c)
      case _ => None
    }

それは私にエラーを与えました:wrong number of arguments for pattern ClassA(a, b, /*and so on*/)

4

2 に答える 2

7

ケース クラスでは、照合時にパラメータのリスト全体を指定する必要があります。

unapply別の方法は、渡した引数を正しく処理する独自のメソッドを実装することです。

于 2013-09-13T15:43:20.050 に答える
4

ケース クラスのコンパニオン オブジェクトにはunapplyではなくメソッドがあるためunapplySeq、機能しません。

1 つのフィールドのみをチェックするために使用する場合unapplyは、次のように定義できます。

object ClassAByA {
  def unapply(obj: ClassA) = Some(obj.a)
}

val ClassAByA(x) = ClassA(100, "thousand", 10000.0)
// x is equal 100 now

ClassA(100, "a", 10000.0) match {
  case ClassAByB(str) => str // str is equal "a" now
}

または、次のように書くこともできます。

something match {
  case c: ClassA => c.b
}
于 2013-09-17T14:49:45.167 に答える