Вы можете выполнить эту работу, если определите объект экстрактора
object `+` {
def unapply(x: Int): Option[(Int, Int)] = Some(x - 1, 1)
}
a match {
case MyCaseClass(x0 + 1) => println(x0) // 17
}
Это также будет работать
a match {
case MyCaseClass(x0 + _) => println(x0) // 17
}
и будьте осторожны, с другим значением это взорвется
a match {
case MyCaseClass(x0 + 2) => println(x0) // MatchError
}
Вы не можете восстановить оба слагаемых из значения суммы.
Еще один вариант -
object `+1` {
def unapply(x: Int): Option[Int] = Some(x - 1)
}
a match {
case MyCaseClass(`+1`(x0)) => println(x0) // 17
}
или
object `+1` {
def unapply(x: Int): Option[(Int, Int)] = Some(x - 1, 42)
}
a match {
case MyCaseClass(x0 `+1` _) => println(x0) // 17
}
Честно говоря, я не знаю не думаю, что оно того стоит.