Я пытаюсь написать экстрактор (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[???] = {
???
}
}
Помощь, пожалуйста?