结语

有了本章中学到的知识,你应该能够开始用Scala完成小的任务,尤其是脚本。在后续的章节中,我们将深入介绍这些主题,并引入那些可能在这里完全不会涉及的内容。

[1]这个to方法实际上并不返回一个数组,而是返回另一种序列,包括了值0、1和2,然后由for表达式遍历。序列和其他集合的相关知识将会在第15章讲到。

[2]变长的参数列表,又叫作重复参数,将在8.8节介绍。

[3]不需要写new List,因为在scala.List的伴生对象上定义了一个工厂方法,即“List.apply()”。你会在4.3节读到更多关于伴生对象的内容。

[4]之所以需要在末尾放一个Nil,是因为::是List类上定义的方法。如果只是写成1 :: 2 :: 3,则编译是不会通过的,因为3的类型是Int,而Int类并没有::方法。

[5]Scala编译器对元组类型使用了语法糖,使它看起来就像是类型的元组。例如,Tuple2[Int, String]可以用(Int, String)表示。

[6]注意,在Scala 3之前,是通过从1开始的字段名,如_1或_2来访问元组的元素的。

[7]Scala 3允许创建任意长度的元组。

[8]由于示例3.6中的集是可变的,并不需要对movieSet重新赋值,这就是为什么它可以是val。与此相对应的是,示例3.5中对不可变集使用+=方法时需要对jetSet重新赋值,因此它必须是var。

[9]在示例3.7中,那段显式的类型参数声明“[Int, String]”是必需的,因为在没有对工厂方法传入任何值的情况下,编译器无法推断出映射的类型。与此相反,在示例3.8中,编译器能够根据传入工厂方法的值推断出类型参数,因此并不需要显式地给出类型参数。

[10]Scala允许对任何对象调用->等方法(这些对象并没有声明这些方法)的机制叫作扩展方法(extension method),这将在第22章中介绍。

[11]有关编译器如何改写for表达式的细节将在7.3节及《Scala高级编程》中给出。

[12]Java 8标准类库引入了Optional类型,不过许多之前已存在的Java类库仍使用null来表示某个可选值的缺失。

[13]不过我们也可以把Option想象成包含0个(None的情况)或1个(Some的情况)元素的集合。