引言
本书是Scala编程语言的教程,由直接参与Scala开发的人来编写。我们的目标是让读者通过本书,能够了解和掌握成为高产的Scala程序员需要知道的一切。书中的示例均通过Scala 2.13.1编译。
谁读本书
本书主要的目标读者是希望学习如何用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章,“函数式对象”,以函数式(即不可变)的分数(rational)为例,更深入地讲解Scala面向对象的特性。
第7章,“内建的控制结构”,展示了如何使用Scala内建的控制结构:if、while、for、try和match。
第8章,“函数和闭包”,给出了对函数的深入介绍,而函数是函数式编程语言最基本的组成部分。
第9章,“控制抽象”,展示了如何通过定义自己的控制抽象来对Scala基本的控制结构进行完善和补充。
第10章,“组合和继承”,更进一步探讨Scala对面向对象编程的支持。本章的主题不像第4章那么基础,但实践中经常会遇到。
第11章,“Scala的继承关系”,解释了Scala的继承关系,并探讨了通用方法和底类型等概念。
第12章,“特质”,介绍了Scala的混入(mixin)组合机制。本章展示了特质的工作原理,描述了特质的常见用法,并解释了特质相对于更传统的多重继承有哪些改进。
第13章,“包和引入”,讨论了大规模编程实践中我们会遇到的问题,包括顶级包、import语句,以及像protected和private那样的访问控制修饰符。
第14章,“断言和测试”,展示了Scala的断言机制,并介绍了用Scala编写测试的若干工具,特别是ScalaTest。
第15章,“样例类和模式匹配”,介绍了这组孪生的结构,让你更好地编写规则的、开放式的数据结构。样例类和模式匹配在处理树形的递归数据时非常有用。
第16章,“使用列表”,详细地解释了列表这个在Scala程序中使用最普遍的数据结构。
第17章,“使用其他集合类”,展示了如何使用基本的Scala集合,如列表、数组、元组、集和映射。
第18章,“可变对象”,解释了可变对象,以及Scala用来表示它们的语法。本章以一个具体的离散事件模拟案例分析收尾,展示了实践中可变对象的适用场景。
第19章,“类型参数化”,用具体的示例解释了第13章介绍过的信息隐藏的技巧:为纯函数式队列设计的类。本章接下来对类型参数的型变进行了说明,介绍了类型参数化对于信息隐藏的作用。
第20章,“抽象成员”,描述了Scala支持的各种抽象成员,不仅是方法可以被声明为抽象的,字段和类型也可以。
第21章,“隐式转换和隐式参数”,介绍了两个能够帮助你从源码中省去那些枯燥细节的概念,让编译器来自动填充或提供。
第22章,“实现列表”,描述了List类的实现。理解Scala列表的工作原理非常重要,List类的实现也展示了Scala若干特性的运用。
第23章,“重访for表达式”,展示了Scala如何将for表达式翻译成map、flatMap、filter和foreach。
第24章,“深入集合类”,详细介绍了Scala集合类库。
第25章,“Scala集合架构”,展示了集合类的构造,以及如何构建自制的集合。
第26章,“提取器”,展示了如何对任意的类进行模式匹配,而不是局限于使用样例类(做模式匹配)。
第27章,“注解”,展示了如何通过注解使用语言扩展。本章描述了若干标准的注解,并解释了如何构建自己的注解。
第28章,“使用XML”,解释了如何用Scala处理XML。本章展示了生成XML、解析XML和处理XML的常见用法。
第29章,“用对象实现模块化编程”,展示了如何使用Scala的对象构建模块化的系统。
第30章,“对象相等性”,指出了编写equals方法时需要考虑的若干问题和需要注意绕开的“坑”。
第31章,“结合Scala和Java”,探讨了在同一个工程中组合Scala和Java时会遇到的若干问题,并对如何解决这些问题给出了建议。
第32章,“Future和并发编程”,展示了如何使用Scala的Future类。尽管完全可以在Scala中使用Java平台的并发编程原语和类库,Scala的Future可以帮助你避开传统的“线程和锁”的并发编程模型里常见的死锁(deadlock)和争用状况(race condition)。
第33章,“组合子解析”,展示了如何用Scala的组合子(combinator)解析器(parser)类库构建解析器。
第34章,“GUI编程”,快速地介绍了可大幅简化基于Swing的GUI编程的Scala类库。
第35章,“SCells试算表”,通过展示一个完整的用Scala编写的试算表应用程序,将本书介绍的所有Scala特性组装串联起来。