Scala模式与参数列表上的组合匹配

rus*_*ins 2 parameters scala pattern-matching

我有一个case类Pair(a: Int, b: Int),它代表一对2个整数.为了拥有Pair(2, 5) == Pair(5, 2),我将该equals方法覆盖如下.

override def equals(that: Any): Boolean = that match {
  case Corner(c, d) => (a == c && b == d) || (a == d && b == c)
  case _ => false
}
Run Code Online (Sandbox Code Playgroud)

现在,平等成立,Pair(2, 5) == Pair(5, 2)返回真实,就像我想要的那样.但是,这在模式匹配时不起作用:

Pair(2, 5) match {
  case Pair(5, 2) => print("This is what I want")
  case _ => print("But this is what I get")
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我吗?可以/我应该这样做吗?有哪些替代方案?我真的不想case Pair(2, 5) | case(5, 2) =>每次与对模式匹配时都要写.

Dyl*_*lan 5

简短回答:
那是行不通的.你可以像这样重写你的陈述:

Pair(2, 5) match {
  case that if that == Pair(5, 2) => println("This is what I want")
  case _ => println("nope")
}
Run Code Online (Sandbox Code Playgroud)

答案很长:
当你match上一个案例课时,它没有使用equals; 它实际上是使用伴侣对象的unapply方法.事实上,斯卡拉match/case声明背后的绝大部分"魔力" 归结为unapply.

写作时case class Pair(a: Int, b: Int),你可以免费获得很多东西.其中一个是提取器,例如:

object Pair {
  def unapply(pair: Pair): Option[(Int, Int)] = {
    Some((pair.a, pair.b))
  }
}
Run Code Online (Sandbox Code Playgroud)

所以,当你说pair match { case Pair(a, b) => ... },编译器认为Pair.unapply(pair),然后分配a_1结果元组位置的值,并分配b_2位置中的值.(如果Pair.unapply(pair)返回None,那个案子就会失败).

从本质上讲,您只能从提取器的每个输入获得一个特定值,但您要查找的内容需要两个.