Scala:是否可以使用 (x+1) 之类的术语作为 case class 模式匹配的参数?

Scala: Is there a possibility to use terms like (x+1) as parameters for case class pattern matching?

假设以下情况

case class MyCaseClass(x: Int) // some case clas with an Int parameter  

val x0 = 17 // some given Int value

val a = MyCaseClass(x=18) // a case class object

// using pattern matching to find out if *a* is of type MyCaseClass and its parameter x equals x0+1
a match {
    case MyCaseClass(x) if x == x0+1 => println("Found my case class with x==x0+1")
}

问题

如果可以跳过上面的 if 语句 if x == x0+1 并只写

就好了
case MyCaseClass(x0+1) => println("Found my case class with x==x0+1")

不幸的是,这无法编译 - 但有什么方法可以实现这样的目标吗?

好吧,你可以 case MyCaseClass(18) 或者如果你真的需要做算术,你可以:

val x1 = x0 + 1
a match {
  case MyCaseClass(`x1`) => ???
}

如果您定义提取器对象,您就可以完成这项工作

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
}

您不能从 sum 的值中恢复两个被加数。

还有一个选择是

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
}

老实说,我认为这不值得。