scala - 为什么 Scala 的 toSeq 将不可变的 Set 转换为可变的 ArrayBuffer?

标签 scala set sequence immutability scala-collections

如果我调用 toSeq在不可变的 Set 上收藏我得到一个 ArrayBuffer .

scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)

这让我很惊讶。鉴于 Scala 强调使用不可变数据结构,我希望得到一个不可变序列,如 Vector。或 List而不是可变的 ArrayBuffer . set 元素的返回顺序当然应该是未定义的,但似乎没有任何语义上的原因说明该顺序也应该是可变的。

一般来说,我希望 Scala 操作总是产生不可变的结果,除非我明确地请求一个可变的结果。这一直是我的假设,但这里的假设不正确,实际上我只花了一个小时调试一个问题,其中意外存在 ArrayBuffer导致 match 中的运行时错误陈述。我的解决方法是更改​​ Set(...).toSeqSet(...).toList , 但这感觉像是一种 hack,因为我的应用程序在那时没有什么特别需要列表的地方。

Set(...).toSeq返回一个可变对象是Scala实现中的一个缺陷,还是我在这里误解了一个原则?

这是 Scala 2.9.2。

最佳答案

Here是最近关于 Seq 是否应该意味着 immutable.Seq 的线程。

罗兰·库恩:

collection.Seq not having mutators is not at all a valid defense!



可变可变参数的例子相当狡猾。

最近,
scala> Set(1,2,3)
res0: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> res0.toSeq
res1: Seq[Int] = ArrayBuffer(1, 2, 3)

scala> res0.to[collection.immutable.Seq]
res2: scala.collection.immutable.Seq[Int] = Vector(1, 2, 3)

关于scala - 为什么 Scala 的 toSeq 将不可变的 Set 转换为可变的 ArrayBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13696357/

相关文章:

c++ - 在 C++11 中打印编译时整数序列

scala - Kafka - 为什么在将 AUTO_OFFSET_RESET_CONFIG 设置为 "latest"时,新的 groupId 不返回主题中的所有消息

scala - 模式匹配如何在exists 函数中工作?

scala - "User did not initialize spark context"在 SPARK YARN 集群模式下使用 Scala 代码时出错

java - 如何解决 AnalysisException : resolved attribute(s) in Spark

algorithm - 快速集重叠匹配算法

python - 为什么 Python 的集差法对空集会耗时?

STL - 在使用 STL 集容器时将 "using namespace std"添加到代码中时调用哪个 find() 函数?

image - FFmpeg:图像到视频,重复 x 次

python - 正则表达式从文件名列表中查找图像序列