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