Scala 2.8 коллекции несоответствия? - PullRequest
7 голосов
/ 14 сентября 2010

почему методы transform (версия мутации на месте map) и retain (версия мутации на месте filter) определены только на mutable.Map, но не на mutable.Buffer и mutable.Set?Разве все изменяемые коллекции не должны поддерживать эти методы?

1 Ответ

8 голосов
/ 14 сентября 2010

Операции retain и transform из Map означают о ключах и значениях , понятия, которые не являются частью Set или Buffer.

Карта - это Iterable, состоящий из пар ключей и значений (также называемых отображениями или ассоциациями).
Основные операции на картах аналогичны операциям на наборах.

Но ваши операции перечислены в:

Поддержка изменяемых карт в дополнение Операции сведены в следующую таблицу.

ms transform f

Преобразует все связанные значения в карте ms с помощью функции f.

ms retain p

Сохраняет только те отображения в ms, которые имеют key удовлетворяющий предикат p.


один-ноль-ноль-один комментарии:

retain и transform по существу являются версиями мутаций на местеfilter и map соответственно и могут быть легко определены для Set и Buffer.
Я не вижу, как они * Map -специфичны.

Iбудет утверждать, что retain и transform предлагают специфичные для карты реализации (в том смысле, что их реализация специально работает с ключами и значениями) для функций, подобных тем, которые предоставляются map и filter из TraversableLike.

Реализация transform в Set и Buffer добавит небольшое значение, так как будет просто зависеть от map.


Примечание: Майкл Кебе комментарии:

Еще одна вещь.immutable.MapLike имеет метод transform, но не метод 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
}
...