提问人:newbie 提问时间:12/30/2020 更新时间:12/30/2020 访问量:61
Programming in Scala 示例混淆(清单 3.5, 创建可变集和不可变集)
Programming in Scala example confusion (Listing 3.5, creating mutable and immutable sets)
问:
我在理解 Scala 编程第 3 版书中的清单 3.5 中的不可变集和可变集时遇到了一些困惑。该段落告诉我它正在创建不可变的集合,然后用 += 更新它,但随后新存储的集合包含所有三个元素。一些问题:
- 这与拥有可变集有何不同?不确定我是否看到了区别。
- 重新分配之前存在的旧集会发生什么情况?
- 如果可以将新集合重新分配给变量,为什么还要称其为不可变集合呢?
jetSet
- 有人在拖钓我并更改了 PDF 中的“可变”和“不可变”吗?(别担心,我也买了一本即将到货的书。
从书中:
创建集合的默认方法如清单 3.5 所示:
var jetSet = Set("Boeing", "Airbus")
jetSet += "Lear"
println(jetSet.contains("Cessna"))
清单 3.5 - 创建、初始化和使用不可变集。 图 3.2 - Scala 集的类层次结构(不包括在内)。 在清单 3.5 的第一行代码中,您定义了一个名为 jetSet 的新变量,并使用包含两个字符串 “Boeing” 和 “Airbus” 的不可变集合对其进行初始化。如此示例所示,您可以在 Scala 中创建集,就像创建列表和数组一样:通过在 Set 配套对象上调用名为 apply 的工厂方法。在清单 3.5 中,您对 scala.collection.immutable.Set 的配套对象调用 apply,该对象返回默认的、不可变的 Set 的实例。Scala 编译器将 jetSet 的类型推断为不可变的 Set[String]。
若要将新元素添加到集合中,请在集合上调用 +,传入新元素。在可变集和不可变集上,+ 方法将创建并返回一个添加了元素的新集。在清单 3.5 中,您正在使用一个不可变的集合。尽管可变集合提供了实际的 += 方法,但不可变集合则不然。
在本例中,第二行代码“jetSet += ”Lear“”实质上是以下代码的简写:
jetSet = jetSet + "Lear"
因此,在清单 3.5 的第二行中,您将 jetSet var 重新分配为一个新集合 包含“波音”、“空客”和“李尔”。最后,清单 3.5 的最后一行打印出集合是否包含字符串 “Cessna”。(如您所料,它打印为假。
如果你想要一个可变集,你需要使用导入,如清单 3.6 所示:
import scala.collection.mutable
val movieSet = mutable.Set("Hitch", "Poltergeist")
movieSet += "Shrek"
println(movieSet)
提前致谢!
答:
jetSet
是一个 .它在分配后引用了一个新的和不同的。var
Set
+=
重新分配之前存在的旧集会发生什么情况?
如果前面的 2 个元素没有被任何其他变量引用,那么它就会被垃圾回收掉。Set
movieSet
是一个 .它将始终引用相同的内容,即使这会改变其值。val
Set
Set
一般来说,突变被认为是不可取的,有经验的 Scala 编码人员会避免这两种情况。
评论
var