gpt4 book ai didi

list - Scala List.contains(x) 返回false,但exists(_.== x) 返回true

转载 作者:行者123 更新时间:2023-12-03 18:19:49 26 4
gpt4 key购买 nike

我正在 Scala 中处理一些简单的数据结构和集合,我注意到我认为的奇怪行为。这是对象:

class State (protected val trackmap: Map[Int, List[String]]) {

override def clone : State = {
new State(Map() ++ trackmap)
}

override def toString = { "State: " + trackmap.toString }

def equals (other: State) : Boolean = {
//println("Comparing " + trackmap + " to " + other.trackmap)
trackmap == other.trackmap

}

def == (other: State) : Boolean = {
this equals other
}
}

和我的相关测试:
  test("state equality") {
val state = new State( Map(1 -> List("engine"), 2 -> List("a"), 3 -> List("b")) )

expect(true) { state equals state.clone }
expect(true) { state == state.clone }
expect(false) { state == new State(Map(1 -> List("a"))) }
expect(false) { state equals new State(Map(1 -> List("a"))) }

expect(true) { List(state).exists( _.equals (state.clone) )}
expect(true) { List(state).exists( _.== (state.clone) )}
expect(true) { List(state).contains( state.clone )}
}

除了最后一个,我希望它应该通过。我没有看过 Scala 源代码,但我认为 contains 将基本上作为第二个存在调用来实现。

最佳答案

您没有覆盖 Scala 的实际 equals 方法,这就是它行为奇怪的原因。
像这样重新编写您的 equals 方法,事情应该可以正常工作:

override def equals (other: Any) : Boolean = {
other match{
case that: State =>
//println("Comparing " + trackmap + " to " + other.trackmap)
trackmap == that.trackmap
case _ => false
}
}

看,Scala 中的 equals 方法采用 Any not State 类型的参数,您需要添加 override它的关键字。

顺便说一句,您甚至不需要 == 方法,因为 Scala 会自动将其重新映射为 equals 方法!

关于list - Scala List.contains(x) 返回false,但exists(_.== x) 返回true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282847/

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