如果我调用toSeq
一个不可变的Set
集合,我会得到一个ArrayBuffer
.
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
这让我很惊讶。鉴于 Scala 强调使用不可变数据结构,我希望得到一个不可变序列,例如 a Vector
orList
而不是 mutable ArrayBuffer
。set 元素的返回顺序当然应该是未定义的,但似乎没有任何语义上的原因说明该顺序也应该是可变的。
一般来说,我希望 Scala 操作总是产生不可变的结果,除非我明确地请求一个可变的结果。这一直是我的假设,但这里的假设不正确,实际上我只花了一个小时调试一个问题,即意外存在ArrayBuffer
导致match
语句中出现运行时错误。我的解决方法是更改Set(...).toSeq
为Set(...).toList
,但这感觉像是一个 hack,因为那时我的应用程序没有什么特别需要列表的地方。
返回一个可变对象是Set(...).toSeq
Scala实现中的一个缺陷,还是我在这里误解了一个原则?
这是 Scala 2.9.2。