如果我调用 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(...).toSeq
至Set(...).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/