2
私はScalaコードを掘り下げました。 TreeMap
は次のビルダークラスを使用しています。マップビルダーは毎回地図を最初から再作成しますか?
class MapBuilder[A, B, Coll <: scala.collection.GenMap[A, B] with scala.collection.GenMapLike[A, B, Coll]](empty: Coll)
extends Builder[(A, B), Coll] {
protected var elems: Coll = empty
def +=(x: (A, B)): this.type = {
elems = (elems + x).asInstanceOf[Coll]
// the cast is necessary because right now we cannot enforce statically that
// for every map of type Coll, `+` yields again a Coll. With better support
// for hk-types we might be able to enforce this in the future, though.
this
}
def clear() { elems = empty }
def result: Coll = elems
}
私はキャストを理解していませんが、それ以外の点です。たとえば、2つのTreeMap
が++
-edである場合、新しいTreeMap
がインスタンス化され、次にTreeMap
のすべてのキーと値のペアが追加されます。 TreeMap
は不変なので、TreeMap
のいずれかから開始して、もう一方のアイテムを追加するだけの理由はありますか?これは単に++
が不変型と可変型の両方で動作するため防御的なコピーを作成する必要があり、一部のコレクションではより効率的な戦略があるからですか?
あなたは絶対に正しいです - 私はそれを逃したか分かりません。ビルダーはおそらくそれがマップやフィルターなどを扱うことができるように書かれています。 – schmmd
右の - 別のコレクションに変換するため。 – schmmd