gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:28:06 24 4
gpt4 key购买 nike

我正在阅读 Scala Creator 的 Programming in 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)。例如,给定一个大的不可变集合 s ,应该能够高效地构建 s + x ,一个带有额外元素的新 Set。当然,不变性保证 s也被保存了下来。在引擎盖下, ss+x将使用某种具有共享组件的树数据结构进行存储。

您问题的标题表明您也在寻找有关使用 val 的建议。或 var .经验法则是使用 val只要你方便。如果 var是必要的,然后尽量限制变量的范围。

关于scala 的可变和不可变设置何时使用 val 和 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6489017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com