Scala 2.8集合不一致性?

7
为什么transform方法(map的就地变异版本)和retain方法(filter的就地变异版本)仅在mutable.Map上定义,而不是在mutable.Buffermutable.Set上定义?难道不应该所有可变集合都支持这些方法吗?

1
还有一件事。immutable.MapLiketransform 方法,但没有 retain 方法。 - michael.kebe
@michael:我已经更新了我的答案,考虑到了这个差异。 - VonC
1个回答

8

Mapretaintransform操作涉及键和值,这些概念不是SetBuffer的一部分。

Map是一个可迭代的对象,由键值对(也称为映射或关联)组成。
Map的基本操作类似于Set。

但是你要列出的操作在下面的表格中:

可变Map支持另外总结在以下表格中的操作。

ms transform f

将映射 ms 中所有关联的值使用函数 f 进行转换。
ms retain p

仅保留满足断言pkeyms中的映射。

一零零一 条评论:

retaintransform 本质上是 filtermap 的原地变异版本,可以很容易地在 SetBuffer 上定义。
我不明白它们如何与 Map 相关。

我认为retaintransform提供了特定于映射的实现(因为它们的实现专门处理键和值),用于类似于mapfilterTraversableLike提供的功能。
SetBuffer中实现transform将添加很少的价值,因为它只会延迟到map
注意:Michael Kebe 评论:

还有一件事。 immutable.MapLike 有一个 transform 方法,但没有 retain 方法。

(与 mutable.MapLike 相反,它们都有)

然而,如果 transform 通过过滤和转换现有映射的绑定来生成新映射,那么这似乎符合 转换操作 的性质。

这是 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
}

源代码 for 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
}

-1、retaintransform本质上是filtermap的原地变异版本,可以在SetBuffer上轻松定义。我不明白它们如何与Map有关。 - one-zero-zero-one
@one:它们的文档涉及特定于Map的概念。但是你是对的,它们可以扩展到Set和Buffer。然而,由于filtermap已经存在,因此对于SetBuffer来说可能不是那么必要。 - VonC
@one-zero-zero-one:我已经更新了我的答案,以反映您的评论。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接