Scala 什么';immutable.Map.Map怎么了?
它是如何工作的?文档似乎有问题: [用例] 通过将函数应用于此不可变映射的所有元素来构建新集合 完整签名Scala 什么';immutable.Map.Map怎么了?,scala,Scala,它是如何工作的?文档似乎有问题: [用例] 通过将函数应用于此不可变映射的所有元素来构建新集合 完整签名 def map[B, That](f: ((A, B)) ⇒ B)(implicit bf: CanBuildFrom[Map[A, B], B, That]): That Map[B]没有意义,因为Map接受两个类型参数 在完整签名中,B映射的type参数和B映射的type参数之间存在名称冲突 可以理解的混淆源于这样一个事实,即map不是在map中实现的,而是在TraversableL
def map[B, That](f: ((A, B)) ⇒ B)(implicit bf: CanBuildFrom[Map[A, B], B, That]): That
没有意义,因为Map[B]
接受两个类型参数Map
- 在完整签名中,
映射的type参数和B
映射的type参数之间存在名称冲突B
- 可以理解的混淆源于这样一个事实,即
map
不是在map
中实现的,而是在TraversableLike
中实现的。但是,中的函数文档由子类继承
TraversableLike
接受两个类型参数TraversableLike[+A,+Repr]
并且map函数具有签名TraversableLike.map[B](f:(A)⇒ B) :可遍历[B]
。在Map
的api文档中,该文档由Map[B]
继承并部分调整Traversable[B]
,但是B
来自TraversableLike
的未解析为(A,B)
表单Map
(可能是Scaladoc中的一个bug,可能无法修复,因为可能存在擦除问题。但这只是我的猜测。)
如果您在成员文档的正上方配置了成员的可见性,则可以检查Map
中实际实现的内容
编辑:
现在谈谈你的核心问题:
如果文档能给我们提供直观的信息
如果我们为了可读性把它简化一点
如果我们进一步使用自然语言而不是首字母缩略词,那么amap[a,B]
的map签名可能如下所示:
map[ResultItem, ResultCollection](f: (A,B) => ResultItem)(implicit bf: CanBuildFrom[Map[A, B], ResultItem, ResultCollection]): ResultCollection
因此,基本上您对Map
的每个键值对应用一个函数,该函数将类型(a,B)的键值对转换为类型ResultType
的值
由于可以从映射(或任何其他集合)构建几乎任何类型的集合,因此此结果类型不必是另一个元组。而且ResultCollection
不必是另一个Map
。例如:
Map("1" -> 1, "2" -> 2).map((keyValuePair: (String, Int)) => keyValuePair._2)
或短
Map("1" -> 1, "2" -> 2).map(_._2)
将列表(1,2)
作为结果,将列表[Int]
作为结果集合,将Int
作为结果项
这是可能的,因为implicitCanBuildFrom
参数添加了一个隐式生成器,该生成器获取map函数的结果并将其附加到其生成器结果。在大多数情况下,CanBuildFrom
是由编译器推断出来的。但是,在某些情况下,它无法推断正确的结果集合
在这种情况下,您必须向编译器提供更多信息:
val test2: Vector[Int] = Map("1" -> 1, "2" -> 2).map(_._2)(collection.breakOut)
val test3: Set[Int] = Map("1" -> 1, "2" -> 2).map(_._2)(collection.breakOut)
关于breakOut
和CanBuildFrom
的更多信息,我建议可以理解的混淆源于map
不是在map
中实现的,而是在TraversableLike
中实现的。但是,中的函数文档由子类继承
TraversableLike
接受两个类型参数TraversableLike[+A,+Repr]
并且map函数具有签名TraversableLike.map[B](f:(A)⇒ B) :可遍历[B]
。在Map
的api文档中,该文档由Map[B]
继承并部分调整Traversable[B]
,但是B
来自TraversableLike
的未解析为(A,B)
表单Map
(可能是Scaladoc中的一个bug,可能无法修复,因为可能存在擦除问题。但这只是我的猜测。)
如果您在成员文档的正上方配置了成员的可见性,则可以检查Map
中实际实现的内容
编辑:
现在谈谈你的核心问题:
如果文档能给我们提供直观的信息
如果我们为了可读性把它简化一点
如果我们进一步使用自然语言而不是首字母缩略词,那么amap[a,B]
的map签名可能如下所示:
map[ResultItem, ResultCollection](f: (A,B) => ResultItem)(implicit bf: CanBuildFrom[Map[A, B], ResultItem, ResultCollection]): ResultCollection
因此,基本上您对Map
的每个键值对应用一个函数,该函数将类型(a,B)的键值对转换为类型ResultType
的值
由于可以从映射(或任何其他集合)构建几乎任何类型的集合,因此此结果类型不必是另一个元组。而且ResultCollection
不必是另一个Map
。例如:
Map("1" -> 1, "2" -> 2).map((keyValuePair: (String, Int)) => keyValuePair._2)
或短
Map("1" -> 1, "2" -> 2).map(_._2)
将列表(1,2)
作为结果,将列表[Int]
作为结果集合,将Int
作为结果项
这是可能的,因为implicitCanBuildFrom
参数添加了一个隐式生成器,该生成器获取map函数的结果并将其附加到其生成器结果。在大多数情况下,CanBuildFrom
是由编译器推断出来的。但是,在某些情况下,它无法推断正确的结果集合
在这种情况下,您必须向编译器提供更多信息:
val test2: Vector[Int] = Map("1" -> 1, "2" -> 2).map(_._2)(collection.breakOut)
val test3: Set[Int] = Map("1" -> 1, "2" -> 2).map(_._2)(collection.breakOut)
有关breakOut
和CanBuildFrom
的更多信息,我建议我理解文档有问题,但您没有回答我问题的核心:“immutable.Map.Map如何工作?”我理解文档有问题,但您没有回答我问题的核心:“immutable.Map.Map如何工作?”