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) =>
每次与对模式匹配时都要写.
简短回答:
那是行不通的.你可以像这样重写你的陈述:
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
,那个案子就会失败).
从本质上讲,您只能从提取器的每个输入获得一个特定值,但您要查找的内容需要两个.