斯卡拉 - 什么地图[(A,B)]是什么意思?

时间:2017-05-26 09:42:21

标签: scala scala-collections

我正在阅读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

1 个答案:

答案 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类型构造函数应用于两个参数,AB

请注意,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