2010-09-28 58 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] 

對此可以做些什麼?也許文本替換的結果可能是類型檢查,這將排除這些邊緣情況。