7

メソッドtransform(インプレースミューテーションバージョンのmap)とretain(インプレースミューテーションバージョンのfilter)がのみで定義されているのに、では定義されていmutable.Mapないのはなぜですか?すべての可変コレクションがこれらのメソッドをサポートするべきではありませんか?mutable.Buffermutable.Set

4

1 に答える 1

8

操作retainおよびtransform、 キーと値Mapに関するものであり、または の一部ではない概念です。SetBuffer

Map は、キーと値のペア (マッピングまたは関連付けとも呼ばれます) で構成される Iterable です。
マップでの基本的な操作は、セットでの操作と似ています。

ただし、操作は次の場所にリストされています。

可変マップは、次の表に要約されている操作に加えてサポートします。

ms transform f

map 内の関連するすべての値msを functionで変換しますf

ms retain p

mspredicateをkey満たすマッピングのみを保持しpます。


ゼロゼロワンのコメント:

retaintransformは本質的に と のインプレース ミューテーション バージョンでfilterあり、 とでmap簡単に定義できます。 それらがどのように特定されているのかわかりません。SetBuffer
Map

私はそれを主張しretaintransformMap 固有の実装 (それらの実装はキーと値を具体的に扱うという点で) によって提供される機能mapfilterから提供されるもののような機能を提供しTraversableLikeます。

と を実装transformしても、単に を無視するだけなので、ほとんど価値がありませSetん。Buffermap


注:マイケル・ケベのコメント:

もう一つ。immutable.MapLikeには methodtransformがありますが、 method はありませんretain

(両方を持っているのとは対照的にmutable.MapLike

ただし、transformが既存のマップのバインディングをフィルタリングおよび変換することによって新しいマップを生成する場合、これは変換操作の性質と一致しているように見えます。

これが変換のソースコードです

def transform[C, That](f: (A, B) => C)(implicit bf: CanBuildFrom[This, (A, C), That]): That = {
  val b = bf(repr)
  for ((key, value) <- this) b += ((key, f(key, value)))
  b.result
}

ただし、のソース コードretainは現在のインスタンスを変更しており、ミュータブル オブジェクトとのみ互換性があります。

/** Retains only those mappings for which the predicate
 *  `p` returns `true`.
 *
 * @param p  The test predicate 
 */
def retain(p: (A, B) => Boolean): this.type = {
  for ((k, v) <- this ; if !p(k, v))
    this -= k

  this
}
于 2010-09-14T06:09:33.197 に答える