斯卡拉多克在地图上的地图

Knu*_*daa 1 scala scala-collections

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

 def   map  [B]  (f: ((A, B)) ? B)  : Map[B]   
Run Code Online (Sandbox Code Playgroud)

"返回一个新的地图,该地图是将给定的函数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)
Run Code Online (Sandbox Code Playgroud)

但是,这种行为是我所期望的.那么文档是错误的,还是我错过了什么?

小智 5

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

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

但你正在使用:

def map [B,That](f :((A,B))⇒B)(隐式bf:CanBuildFrom [Map [A​​,B],B,That]):那个

因为你要返回一个字符串,所以你不是使用拳头而是第二个.为此,ScalaDoc说:

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


ret*_*nym 5

@usecaseScaladoc 的加入是相当匆忙构思和实现的,并且有一些皱纹.在这种情况下,用例在Scaladoc中定义TraversableLike#map:

@usecase def map[B](f: A => B): $Coll[B]
Run Code Online (Sandbox Code Playgroud)

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

/**
 *  @define Coll Map
 *  @define coll map
 */
object Map extends MapFactory[Map]
Run Code Online (Sandbox Code Playgroud)

可以做些什么呢?也许文本替换的结果可以进行类型检查,这将排除这些边缘情况.