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,那个案子就会失败).
从本质上讲,您只能从提取器的每个输入获得一个特定值,但您要查找的内容需要两个.
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |