1

根据 Map 对象上的 map 方法的 scaladoc,它应该返回一个新的 Map:

 def   map  [B]  (f: ((A, B)) ⇒ B)  : Map[B]   

“返回一个新的地图,通过将给定的函数 f 应用于该地图的每个元素并收集结果。”

但它没有:

scala> val countries = Map("NO" -> "Norway", "US" -> "United States", "DE" -> "Germany")
countries: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map((NO,Norway), (US,United States), (DE,Germany))

countries map { _._1 }
res4: scala.collection.immutable.Iterable[java.lang.String] = List(NO, US, DE)

不过,这种行为是我所期望的。那么文档是错误的,还是我遗漏了什么?

4

2 回答 2

5

对 Scaladoc的@usecase补充是相当仓促的构思和实施,并且有一些皱纹。在这种情况下,用例在 Scaladoc 中定义为TraversableLike#map

@usecase def map[B](f: A => B): $Coll[B]

$Coll使用 . 中定义的值替换为简单的文本替换scala.collection.Map

/**
 *  @define Coll Map
 *  @define coll map
 */
object Map extends MapFactory[Map]

对此可以做些什么?也许可以对文本替换的结果进行类型检查,从而排除这些边缘情况。

于 2010-09-28T16:51:25.903 回答
5

您正在阅读错误的地图功能。

def map [B] (f: ((A, B)) ⇒ B) : Map[B]

但是您正在使用:

def map [B, That] (f: ((A, B)) ⇒ B)(implicit bf: CanBuildFrom[Map[A, B], B, That]) : That

由于您要返回一个字符串,因此您不是使用第一个而是第二个。为此,ScalaDoc 说:

“通过将给定函数 f 应用于此映射的每个元素并收集结果而产生的新类型集合。”

于 2010-09-28T11:51:22.153 回答