3

キーの周りに同等性が定義されているSetof 要素がありますが、他のフィールドは異なる場合があります...したがって、「更新」する必要がある場合、これが私が試したものです:

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 段階で行う必要がありますか?

4

1 に答える 1

5

私の見解では、それは実際にはモデリングの概念の問題です。要点は、等しいオブジェクトは実際には同等である必要があるということです...そうでない場合は、他の構造を検討する必要があるかもしれません。たとえば、(または)にMapマップidしてみませんか? これは概念的にははるかに明確に見え、それを使用して更新できます。messageidK(id,message).updated(1,"c")

于 2013-02-05T20:55:34.867 に答える