2010-09-28 103 views
1

按照scaladoc为地图对象在地图上的方法,则它应该返回一个新的地图:scaladoc在地图上地图

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) 

这种行为是我所期望的,但。那么文档是错误的,还是我错过了一些东西?

+0

您在文档中的哪个位置找到了它?这里(http://www.scala-lang.org/api/current/scala/collection/mutable/Map.html)有点不同。也许这是Scala版本之间的区别。 – amorfis 2010-09-28 11:22:18

+0

http://www.scala-lang.org/api/current/scala/collection/Map.html – 2010-09-28 11:30:56

回答

5

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

DEF映射[B](F:((A,B))⇒B):地图[B]

但使用的是:

DEF映射[B,即(F: ((A,B))⇒B)(隐式bf:CanBuildFrom [Map [A​​,B],B,That]):

由于您正在返回一个字符串,您不会使用拳头,对于它ScalaDoc说:

“一个新的集合的类型,由于将给定的函数f应用于此地图的每个元素并收集结果。”

+0

这是有道理的。但是我认为文档在这一点上可能会更清晰,因为用于简化对这些复杂方法签名的理解的“用例”实际上使得它更容易混淆。结果虽然很直观,但可能是最重要的。 – 2010-09-28 12:26:34

+1

它们都是相同的功能。正如反义词所指出的那样,更简单的是@usecase。 – 2010-09-28 18:35:24

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] 

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