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

scala的可变和不可变集何时使用val和var

发布时间:2020-12-16 08:52:19 所属栏目:安全 来源:网络整理
导读:我正在阅读 Scala Creator编写的Scala编程书,我对Set的例子有点困惑. 这里是不可变集: var jetSet = Set("Boeing","Airbus")jetSet += "Lear"println(jetSet.contains("Cessna")) 这有什么意义? 该集是不可变的,但变量jetSet是可变的. 1)所以每次我使用=添
我正在阅读 Scala Creator编写的Scala编程书,我对Set的例子有点困惑.

这里是不可变集:

var jetSet = Set("Boeing","Airbus")
jetSet += "Lear"
println(jetSet.contains("Cessna"))

这有什么意义?

该集是不可变的,但变量jetSet是可变的.
1)所以每次我使用=添加到集合时它会创建一个新集合?那么变量指向内存中的新集合?

2)不应该是:
val jetSet = set(“cow”,“sheep”,“duck”)?为什么它必须是var?是否有理由将var用于不可变集合?

解决方法

不可变数据结构(在本例中为Set)的优点是它们是持久的.例如:

var jetSet1 = Set("Boeing","Airbus")
val jetSet2 = jetSet1 // ... imagine jetSet2 is somewhere else in the program
jetSet1 += "Lear"
assert(!jetSet2.contains("Lear"))

这些Set对象的不变性使得更容易推理程序,因为对jetSet1变量的更新在代码的其他部分没有副作用(在这种情况下,使用jetSet2的地方).虽然从这个例子中不清楚,但有时候将不可变值存储在可变var引用中是很方便的.最常见的是,var将具有有限的范围(例如,函数的本地).

不可变数据结构通常具有非常高效的巧妙实现.不幸的是,Scala集合API没有关于性能的详细记录,但我预计大多数操作大致为O(log N)时间.例如,给定一个大的不可变Set,人们应该能够有效地构造s x,一个带有额外元素的新Set.当然,不变性保证了s也得以保留.在引擎盖下,s和s x将使用某种具有共享组件的树数据结构进行存储.

您的问题标题表明您也在寻找有关使用val或var的建议.经验法则是在方便的时候使用val.如果需要var,则尝试尽可能地限制变量的范围.

(编辑:李大同)

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

    推荐文章
      热点阅读