Scala 编程示例混淆代码清单 3.5,创建可变和不可变集

问题描述

我对《Programming in 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 中创建集合,类似于创建列表和数组的方式:通过调用一个名为 apply 的工厂方法在 Set 伴随对象上。在代码清单 3.5 中,您对 scala.collection.immutable.Set 的伴随对象调用 apply,它返回一个默认的、不可变的 Set 实例。 Scala 编译器将 jetSet 的类型推断为不可变的 Set[String]。

要向集合中添加新元素,请在集合上调用 +,传入新元素。在可变和不可变集合上, + 方法将创建并返回一个添加了元素的新集合。在代码清单 3.5 中,您使用的是不可变集合。尽管可变集提供了实际的 += 方法,但不可变集没有。

在这种情况下,第二行代码“jetSet +=“Lear””本质上是以下内容的简写:

jetSet = jetSet + "Lear"

因此,在代码清单 3.5 的第二行中,您用一个新集合重新分配了 jetSet 变量 包含“波音”、“空中客车”和“李尔”。最后,代码清单 3.5 的最后一行打印出该集合是否包含字符串“Cessna”。 (如您所料,它打印出 false。)

如果你想要一个可变集,你需要使用一个导入,如代码清单 3.6 所示:

import scala.collection.mutable

val movieSet = mutable.Set("Hitch","Poltergeist") 
movieSet += "Shrek"
println(movieSet)

提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)