1.5 结语
本章带你领略了Scala和它可能给你的编程工作带来的帮助。当然,Scala并不是“银弹”,并不能魔法般地让你更加高产。要做出实际的进步,需要根据实际需求有选择地应用Scala,这需要学习和实践。如果你是从Java来到Scala的,则最具挑战的可能是Scala的类型系统(比Java的类型系统更为丰富)和Scala对函数式编程的支持。本书的目标是循序渐进地引导你逐步学习和掌握Scala。我们认为这会是一次有收获的智力旅程,能帮助你拓展知识领域并对程序设计有新的、不一样的思考。希望你能通过Scala编程获得快乐和启发。
下一章,我们将带你开始编写实际的Scala代码。
[1]Scala的发音为skah-lah(斯嘎喇)。
[2]如果你还不太清楚这个程序的细节,请容我们继续讲下去,这些细节在后面两章都会介绍。
[3]Raymond,《大教堂与市集》[Ray99]
[4]Steele,《培育编程语言》[Ste99]
[5]factorial(x),或者数学表示法x!,是算式1 × 2 × … × x的结果,其中0!的结果定义为1。
[6]Scala自带标准库,本书会介绍其中的一些功能。更多信息请参考随Scala发行且可以在线查询的标准库Scaladoc文档。
[7]Kay,《Smalltalk的早期历史》[Kay96](全书参考资料列表下载方法见“读者服务”)
[8]从Java 8开始,接口可以有默认方法(default method)实现,不过默认方法并不能提供Scala特质的所有特性。
[9]最开始,Scala还有另一个实现运行在.NET平台,不过现在已经不活跃了。而最近,另一个运行在JavaScript上的实现——Scala.js,正在变得越来越流行。
[10]在Scala 3.0.0中,标准的扩展通过隐式转换(implicit conversion)实现。在后续版本中,这些实现细节将被替换为扩展方法(extension method)。
[11]译者注:截至本书第5版成稿,《Scala高级编程》(Advanced Programming in Scala)还未出版。
[12]唯一真正的区别在于Scala生成的实例变量是final的。你会在10.6节了解到如何编写不是final的实例变量。
[13]当函数字面量的结果类型是Boolean时,可以被称作前提。
[14]用下画线作为入参的占位符的用法在8.5节有详细介绍。
[15]我们将在第18章介绍泛型;在17.5节介绍交集(如A & B & C);在第20章介绍抽象类型。
[16]Kay,一封关于面向对象编程意义的电子邮件。[Kay03]
[17]Dijkstra,《结构化编程笔记》[Dij70]
[18]Scala在类型标注方面与Java最大的不同:Scala的写法是“variable: Type”而不是Java的“Type variable”。Scala的这种将类型写在后面的做法类似于Pascal、Modula-2和Eiffel。这个区别的主要原因与类型推断相关:类型推断让我们省去对变量类型和方法返回类型的声明。如果用“variable: Type”这样的语法,则简单地去掉冒号和类型名称即可。而如果用C风格的“Type variable”语法,则无法简单地去掉类型名称,因为再没有其他的标记来开始一个定义了。这时需要某种其他的关键字来表示缺失的类型标注(C# 3.0在一定程度上支持类型推断,采用了var关键字)。这种额外的关键字更像是临时添加的,与Scala采用的方式相比,就显得不那么常规和自然。
[19]译者注:这类对象拥有某种统一的行为特征,或者说同时支持某种操作或方法,而不是简单、死板地声明为继承自某个共通的超类型。
[20]Landin,《未来的700种编程语言》[Lan66]
[21]想获取更多信息,请查阅参考文献中的[Ode03]、[Ode05]和[Emi07]。