gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:20:02 26 4
gpt4 key购买 nike

我有一个案例类 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
}

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

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

有人可以帮助我吗?我可以/应该这样做吗?有哪些选择?我真的不想写 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")
}

长答案:
当您在案例类上匹配时,它没有使用equals;它实际上是在使用伴随对象的 unapply 方法。事实上,scala 的 match/case 语句背后的大部分“魔法”都归结为 unapply

当你编写case class Pair(a: Int, b: Int)时,你会免费得到很多东西。其中之一是 an extractor ,例如:

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

所以当你说 pair match { case Pair(a, b) => ... } 时,编译器认为 Pair.unapply(pair),然后赋值a 到结果元组的 _1 位置的值,并将 b 分配给 _2 中的值位置。 (如果 Pair.unapply(pair) 返回 None,则该情况将失败)。

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

关于Scala 模式与参数列表上的组合匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38062375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com