キーの周りに同等性が定義されているSet
of 要素がありますが、他のフィールドは異なる場合があります...したがって、「更新」する必要がある場合、これが私が試したものです:
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
メソッドは左側のセットの要素を保持しますが、その動作は文書化されていません。だから頼ってはいけない。
だから今、私が見逃していることがもっと明白な何かがありますか? 実際の動作に依存する必要がありますか (そして、変更された場合に備えてテストを記述します)? または、更新を 2 段階で行う必要がありますか?