我正在阅读Scala Map文档,并对此方法签名感到困惑
def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Map[(A, B)]
Map[(A, B)]
是什么意思?它与Map[A, B]
相同吗?感谢
链接到doc:
http://www.scala-lang.org/api/current/scala/collection/immutable/Map.html
答案 0 :(得分:3)
我正在阅读Scala Map文档,并对此方法签名感到困惑
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
Map[(A, B)]
是什么意思?
(A, B)
是Tuple2[A, B]
的语法糖,即一对(又称2元组)类型。
是否与
Map[A, B]
相同?
不,Map[Tuple2[A, B]]
与Map[A, B]
不同:前者将Map
类型构造函数应用于单参数(A, B)
,而后者将Map
类型构造函数应用于两个参数,A
和B
。
请注意,Map
类型构造函数有两个参数,所以前者只是一个错误:您不能将Map
类型构造函数仅应用于单个参数,您需要两个。
请记住,您看到的签名只是一个用例,它由人为人编写来读取,未通过类型验证检查即可。因此,它可能包含错误。
另请注意,整个集合层次结构中存在大量重复类型签名和用例,这些是由其他脚本生成的。看起来其中一个脚本只会为Map.zipAll
生成错误的签名(请注意,zip
上的其他Map
变体中也存在相同的错误。
一个小实验表明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
。