为什么Scala的toSeq将不可变的Set转换成可变的ArrayBuffer?
发布时间:2020-12-16 09:36:34 所属栏目:安全 来源:网络整理
导读:如果我在一个不可变的Set集合上调用seq,我得到一个ArrayBuffer。 scala Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1,3) 这让我感到惊讶鉴于Scala强调使用不可变数据结构,我希望得到一个不可变序列,如Vector或List而不是可变的ArrayBuffer。设
如果我在一个不可变的Set集合上调用seq,我得到一个ArrayBuffer。
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1,3) 这让我感到惊讶鉴于Scala强调使用不可变数据结构,我希望得到一个不可变序列,如Vector或List而不是可变的ArrayBuffer。设置元素的返回顺序当然应该是未定义的,但是似乎没有任何语义的原因,为什么这个排序也应该是可变的。 一般来说,我希望Scala操作总是产生不可变的结果,除非我明确要求一个可变的结果。这一直是我的假设,但这是一个不正确的,我实际上花了一个小时调试一个问题,其中ArrayBuffer的意外存在导致了匹配语句中的运行时错误。我的修复是将Set(…)toSeq更改为Set(…)。toList,但这感觉就像一个黑客,因为我的应用程序没有什么需要一个列表,特别是在那一点上。 有Set(…)。toSeq在Scala的实现中返回一个可变对象的缺陷,还是有一个我在这里误解的原则? 这是Scala 2.9.2。 解决方法
Here是最近关于Seq是否意味着不变的线索。
罗兰·库恩
可变变量的例子相当偷偷摸摸。 最近, scala> Set(1,3) res0: scala.collection.immutable.Set[Int] = Set(1,3) scala> res0.toSeq res1: Seq[Int] = ArrayBuffer(1,3) scala> res0.to[collection.immutable.Seq] res2: scala.collection.immutable.Seq[Int] = Vector(1,3) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |