引言
本书是Scala编程语言的教程,由直接参与Scala开发的人来编写。我们的目标是让读者通过本书,能够了解和掌握成为高产的Scala程序员需要知道的一切。书中的所有示例均能通过Scala 3.0.0的编译。
谁读本书
本书主要的目标读者是希望学习如何使用Scala编程的人。如果你想在你的下一个项目中使用Scala,本书就是为你准备的。除此之外,本书对于那些想要学习新知识从而开阔自己眼界的程序员也同样有益。比方说,如果你是Java程序员,那么阅读本书,你将接触到来自函数式编程领域和高阶面向对象领域的许多概念。我们相信,通过学习Scala及Scala背后的观念,你将成为一名更好的程序员。
我们假定你拥有常规的编程知识。虽然Scala作为用于入门的编程语言并没有什么不妥,但是本书并不适用于(从零开始)学习编程。
另一方面,阅读本书并不要求读者具备某项具体的编程语言的知识。我们当中大部分人都是在Java平台上使用Scala的,但本书并不假定你了解Java本身。不过,我们预期大部分读者都熟悉Java,因此我们有时会将Scala与Java做对比,帮助这些读者理解它们之间的区别。
如何使用本书
本书的主旨是教学,我们推荐的阅读顺序是从前到后,依次阅读各章。我们尽可能每次只引入一个主题,同时只使用已经介绍过的主题来解释这个新的主题。因此,如果你跳过前面的章节,则可能会遇到某些并不十分理解的概念。只要你按顺序阅读,就会发现掌握Scala是循序渐进、顺理成章的。
如果你看到某个不明白的词汇,记得查看术语表。许多读者都喜欢快速浏览特定的章节,这没有问题,目录能帮助你随时找回阅读的坐标和方位。
当你读完本书以后,还可以继续将其当作语言参考书。Scala编程语言有一份正式的语言规范,但语言规范强调的是精确性,而不是可读性。虽然本书不会覆盖Scala的每一个细节,但是它也足够全面,应该能够在你逐渐成为Scala编程能手的过程中,承担起语言参考书的职责。
如何学习Scala
通读本书,你可以学到很多关于Scala的知识。不过,如果你做一些额外的尝试,则可以学得更快,更彻底。
首先,利用好包含在本书中的代码示例。手动将这些代码示例录入,有助于在脑海中逐行过一遍代码。尤其是在录入过程中尝试一些变化,会非常有趣,这也能让你确信自己真的理解了它们背后的工作原理。
其次,时常访问在线论坛。这样,你和其他Scala爱好者可以互相促进。网上有大量的邮件列表、讨论组、聊天室、Wiki和Scala特定主题的订阅。花费一些时间,找到满足你需求的内容,你会在小问题上花更少的时间,有更多的时间和精力投入更深入、更重要的问题中。
最后,一旦你读得足够多,就可以自己启动一个编程项目。例如,从头编写小程序,或者为某个更大的项目开发组件,因为仅仅阅读并不会让你走得更远。
排版和字体规格
当某个术语在正文中首次出现时,我们使用楷体中文和斜体英文显示它。对于短小的代码示例,如x + 1,我们使用等宽字体将其内嵌在正文中。对于较长的代码示例,我们使用等宽字体以如下方式呈现:
当出现交互式shell时,来自shell的响应内容以更轻的字体呈现:
内容概览
• 第1章,“一门可伸缩的语言”,主要介绍Scala的设计及背后的概念和历史。
• 第2章,“Scala入门”,介绍了如何使用Scala完成一些基础的编程任务,但并不深入讲解它是如何工作的。本章的目标是让你可以开始输入Scala代码并执行。
• 第3章,“Scala入门(续)”,展示了更多基本的编程任务,帮助你快速上手Scala。学习完本章以后,你应该就能使用Scala完成简单的脚本型任务了。
• 第4章,“类和对象”,开始深入介绍Scala,描述其基本的面向对象的组成部分,并指导大家如何编译并运行Scala应用程序。
• 第5章,“基本类型和操作”,介绍了Scala基本类型、字面量和支持的操作,(操作符的)优先级和结合律,以及对应的富包装类。
• 第6章,“函数式对象”,以函数式(即不可变)的分数为例,更深入地讲解Scala面向对象的特性。
• 第7章,“内建的控制结构”,展示了如何使用Scala内建的控制结构:if、while、for、try和match。
• 第8章,“函数和闭包”,给出了对函数的深入介绍,而函数是函数式编程语言最基本的组成部分。
• 第9章,“控制抽象”,展示了如何通过定义自己的控制抽象来对Scala基本的控制结构进行完善和补充。
• 第10章,“组合和继承”,更进一步探讨Scala对面向对象编程的支持。本章的主题不像第4章那么基础,但在实践中经常会遇到。
• 第11章,“特质”,介绍了Scala的混入组合机制。本章展示了特质的工作原理,描述了特质的常见用法,并解释了特质相对于更传统的多重继承有哪些改进。
• 第12章,“包、引入和导出”,讨论了大规模编程实践中我们会遇到的问题,包括顶级包,import语句,以及像protected和private那样的访问控制修饰符。
• 第13章,“样例类和模式匹配”,介绍了这组孪生的结构。它们在处理树形的递归数据时非常有用。
• 第14章,“使用列表”,详细地解释了列表这个在Scala程序中使用最普遍的数据结构。
• 第15章,“使用其他集合类”,展示了如何使用基本的Scala集合,如列表、数组、元组、集和映射。
• 第16章,“可变对象”,解释了可变对象,以及Scala用来表示可变对象的语法。本章以一个具体的离散事件模拟案例分析收尾,展示了实践中可变对象的适用场景。
• 第17章,“Scala的继承关系”,解释了Scala的继承关系,并探讨了通用方法和底类型等概念。
• 第18章,“类型参数化”,使用具体的示例解释了第13章介绍过的信息隐藏的技巧:为纯函数式队列设计的类。本章接下来对类型参数的型变进行了说明,介绍了类型参数化对于信息隐藏的作用。
• 第19章,“枚举”,介绍了枚举和代数数据类型(ADT)这组孪生的结构,让你更好地编写规则的、开放式的数据结构。
• 第20章,“抽象成员”,描述了Scala支持的各种抽象成员,不仅方法可以被声明为抽象的,字段和类型也可以。
• 第21章,“上下文参数”,介绍了Scala如何帮助你对函数使用上下文参数。将所有的上下文信息都直接带入并不是什么难事,但会因此增加很多样板代码,上下文参数能帮助你减少一些样板代码。
• 第22章,“扩展方法”,介绍了Scala如何让一个在类定义之外的函数看起来像是类自己定义的那样的机制。
• 第23章,“类型族”,展示了类型族的若干示例。
• 第24章,“深入集合类”,详细介绍了Scala集合类库。
• 第25章,“断言和测试”,展示了Scala的断言机制,并介绍了用Scala编写测试的若干工具,特别是ScalaTest。
资源
在Scala的官方网站中,你可以找到Scala的最新下载文档和社区资源。如果你需要一份更浓缩的Scala资源列表,则可以访问本书的网站(见网址列表条目[2])。
源码
本书的源码可以从本书的网站下载(ZIP格式),且源码以Apache 2.0开源许可提供。
勘误表
虽然本书经过了大量审校,但是疏漏依然不可避免。本书的勘误表(希望不会很长)可以通过网址列表条目[3]找到。如果你发现了本书的错误,请通过上面的地址提交给我们,我们将在后续批次和版本中修正。