gpt4 book ai didi

scala - Scala 2.8.0 和 2.7.7 中 Map 行为的这种令人惊讶的差异(对我来说)是预期的吗?

转载 作者:行者123 更新时间:2023-12-02 07:36:23 26 4
gpt4 key购买 nike

在 Scala 2.8.0 中,如果您将一个 Map 实例映射()到一个 2 元组序列,那么您最终会得到一个 Map。发生这种情况时,任何具有相同第一个元素的 2 元组都被视为重复,并且您最终只能得到最后一个。这与 2.7.7 中发生的情况不同。通过示例更容易理解。

Scala 2.7.7:

scala> val m = Map("a" -> 1, "b" -> 2, "c" -> 3)
m: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1, b -> 2, c -> 3)

scala> m.map { case (k, v) => ("foo", v) }
res5: Iterable[(java.lang.String, Int)] = ArrayBuffer((foo,1), (foo,2), (foo,3))

Scala 2.8.0:

scala> val m = Map("a" -> 1, "b" -> 2, "c" -> 3)
m: scala.collection.immutable.Map[java.lang.String,Int] = Map((a,1), (b,2), (c,3))

scala> m.map { case (k, v) => ("foo", v) }
res16: scala.collection.immutable.Map[java.lang.String,Int] = Map((foo,3))

这是预期的吗?更改是否记录在某处?这似乎是一个合理的想法,但它花费了我很多时间来升级依赖于旧行为的 2.7.7 应用程序。

更新:

正如下面 Kris Nuttycombe 所指出的,阅读 Migrating from Scala 2.7在提出这个问题之前可能是一个好的开始:) 特别是它提到使用编译器标志 -Xmigration,这在移植时似乎非常有用。

最佳答案

是的,这是预期的行为;事实上,启用此类功能是 2.8 中收集系统重新设计的一个重点。默认情况下,Scala 在应用映射函数时会选择最具体的类型;但是,如果您需要可迭代(例如,因为您担心通过重复键消除值,最简单的事情可能是简单地在 map 上调用 toSeq :

scala> val iter = m.toSeq.map { case (k, v) => ("foo", v) }                                  
iter: Seq[(java.lang.String, Int)] = List((foo,1), (foo,2), (foo,3))

就记录而言,这里进行了广泛的讨论:http://www.scala-lang.org/node/2060 (更是如此)这里:http://www.scala-lang.org/docu/files/collections-api/collections.html

关于scala - Scala 2.8.0 和 2.7.7 中 Map 行为的这种令人惊讶的差异(对我来说)是预期的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3999289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com