我有一个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))
}
添加一个已经存在的元素不会更改集合,然后先删除它并再次添加更新的元素似乎不是最理想的。
该union
方法保留左侧集合的元素,但没有记录该行为;所以我不应该依赖它。
那么现在,我是否缺少更明显的东西?我是否应该依赖实际行为(并编写测试以防万一它发生变化)?还是我应该分两步进行更新?