7

複数のパラメーターのケースクラスとの照合に使用するエクストラクターを作成しようとしています。簡略化した例:

case class X(p1: String, p2: Int)

各エクストラクタオブジェクトにp1の固定値を定義してもらいたいのですが、p2は使用時に定義されます。(A、BなどをケースクラスおよびサブクラスXにすることはできません。また、ケースとしてX( 、)を使用したいと思います)applyメソッドの例:

object A {
  def apply(p2: Int): X = X("A", p2)
}

object B {
  def apply(p2: Int): X = X("B", p2)
}

...

パターンマッチングについては、次のように一致させたいと思います。

X("A", 2) match {
  case A(2) => true // <- should match: p1="A" and p2=2
  case A(_) => true // <- should match: p1="A" and p2=_
  case X("A", _) => true // <- should match: p1="A" and p2=_
  case A(1) => false // <- should not match
  case B(2) => false // <- should not match: p1="B" and p2=2
}

、などでunapplyメソッドを定義する必要があることはわかっていますが、署名とロジックがどうあるべきか完全に混乱しています。AB

object A {
  def unapply(x: ???): Option[???] = {
    ???
  } 
}

助けてください?

4

1 に答える 1

14

unapplyAny を受け取り、Option抽出したいものの を返します。あなたの場合、これは次のようになります。

scala> case class X(p1: String, p2: Int)
defined class X

scala> object A {
     |   def unapply(target: Any): Option[Int] =
     |     PartialFunction.condOpt(target) {
     |       case X("A", p2) => p2
     |     }
     | }
defined module A

scala> val A(x) = X("A", 1)
x: Int = 1

scala> val A(x) = X("B", 1)
scala.MatchError: X(B,1) (of class X)
...

しかし、正直なところ、あなたが思いついた例は and なしで書き直すことができAますB:

X("A",2) match {
  case X("A", 2) => true
  case X("A", 1) => false
  case X("A", _) => true
  case X("B", 2) => false
}
于 2012-06-28T06:04:27.780 に答える