for*_*ran 3 scala set immutability
我有一个Set元素,它们在键周围定义了相等,但其他字段可能不同......所以当我需要'更新'时,这就是我尝试过的:
object sandbox {
case class K(val id: Int, val message: String) {
override def equals(that: Any) = that match {
case K(this.id, _) => true
case _ => false
}
override def hashCode = this.id
override def toString = "(" + id + "," + message + ")"
}
val s = Set(K(1, "a"), K(2, "b")) //> s : scala.collection.immutable.Set[test.sandbox.K] = Set((1,a), (2,b))
val updatedElem = K(1, "c") //> updatedElem : test.sandbox.K = (1,c)
s + updatedElem //> res0: scala.collection.immutable.Set[test.sandbox.K] = Set((1,a), (2,b))
Set(updatedElem) | s //> res1: scala.collection.immutable.Set[test.sandbox.K] = Set((1,c), (2,b))
}
Run Code Online (Sandbox Code Playgroud)
添加已经存在的元素将不会更改集合,并且首先将其删除并再次添加更新似乎是次优的.
该union方法保留了左侧的集合元素,但没有记录该行为; 所以我不应该依赖它.
所以,现在,有什么更明显的我失踪了吗?我应该依赖于实际行为(并且只是在它发生变化的情况下编写测试)吗?或者我应该分两步进行更新?
从我的角度来看,它实际上是建模中的概念问题.关键是等于对象应该是等价的......否则你可能想要考虑其他一些结构.例如,为什么不尝试Map映射id到message(或id到K(id,message))?这在概念中似乎更清晰,然后您可以使用.updated(1,"c")它来更新它.