加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么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是否意味着不变的线索。

罗兰·库恩

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

可变变量的例子相当偷偷摸摸。

最近,

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读