我正在 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/