Scala List.contains(x)返回false,但exists(_.== x)返回true
发布时间:2020-12-16 18:26:08 所属栏目:安全 来源:网络整理
导读:我在 Scala中使用一些简单的数据结构和集合,我注意到我认为是奇怪的行为.这是对象: class State (protected val trackmap: Map[Int,List[String]]) { override def clone : State = { new State(Map() ++ trackmap) } override def toString = { "State: "
我在
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源代码,但我认为包含将基本上作为第二个存在的调用实现. 解决方法
你没有覆盖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方法! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |