I'm reading the Scala Map doc, and got confused by this method signature
def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Map[(A, B)]
這是不方法簽名。這是「use case signature」。它是一個簡化的簽名,表示該方法最常用的用法。所述真正簽名是:
def zipAll[B, A1 >: (K, V), That](that: GenIterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Map[K, V], (A1, B), That]): That
What does Map[(A, B)]
mean?
(A, B)
爲Tuple2[A, B]
語法糖,即一對(又名2-元組)類型。
Is it the same as Map[A, B]
?
沒有,Map[Tuple2[A, B]]
是不一樣的Map[A, B]
:前者適用的Map
類型構造一個單參數(A, B)
而後者適用的Map
類型的構造函數來參數,A
和B
。
請注意,Map
類型構造函數有兩個參數,所以前者只是一個錯誤:您不能將Map
類型構造函數僅應用於一個參數,您需要兩個參數。
請記住,你看到的簽名是唯一一個用例,它是由人類書面爲人類閱讀,它是不是類型檢查驗證。因此,它可以包含錯誤。
還要注意,整個集合層次結構中有很多重複類型簽名和用例,這些由另外的腳本生成。看起來其中一個腳本只是產生了Map.zipAll
的錯誤簽名(請注意,Map
上的其他zip
變體中也存在相同的錯誤)。
一個小實驗顯示zip
將映射的鍵值對作爲結果對的第一個元素和來自that
集合的元素作爲結果對的第二個元素,並從中構建映射,這會導致地圖裏面有原鍵值對的鍵和other
元素值:
Map("one" → 1, "two" → 2) zip Seq('a, 'b, 'c)
//=> Map((one, 1) -> 'a, (two, 2) -> 'b)
因此,簡化使用情況的簽名應該是這樣的:
def zipAll[A](that: collection.Iterable[A], thisElem: (K, V), thatElem: A): Map[(K, V), A]
它看起來像腳本感到困惑,並且在簽名中用(K, V)
代替A
。
沒有任何意義,這是錯誤的,我不知道爲什麼那件事仍然存在。 –
「仍然」你的意思是這是一個已知的/已經報告的問題? –
其實,我認爲我的問題重複了這個https://stackoverflow.com/q/26132459/842860 – stackoverflower