Scala -экстрактор не применять путаницу

Я пытаюсь написать экстрактор (s )для использования в сопоставлении с классом case с несколькими параметрами. Упрощенный пример:

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

Я бы хотел, чтобы каждый объект экстрактора определял фиксированное значение для p1, а p2 определялось при использовании. (A, B и т. д. не могут быть классом case и подклассом 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в A, Bи т. д., но я полностью запутался, какими должны быть подпись и логика:

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

Помощь, пожалуйста?

7
задан nbro 31 March 2017 в 10:36
поделиться