目录概览 3
第1章 可伸展的语言 3
第2章 Scala入门初探 15
第3章 Scala入门再探 23
第4章 类和对象 37
第5章 基本类型和操作 47
第6章 函数式对象 61
第7章 内建控制结构 73
第8章 函数和闭包 89
第9章 控制抽象 103
第10章 组合与继承 113
第11章 Scala的层级 131
第12章 特质 137
第13章 包和引用 151
第14章 断言和单元测试 161
第15章 样本类和模式匹配 171
第16章 使用列表 193
第17章 集合类型 215
第18章 有状态的对象 233
第19章 类型参数化 249
第20章 抽象成员 265
第21章 隐式转换和参数 285
第22章 实现列表 301
第23章 重访For表达式 309
第24章 抽取器(Extractors) 321
第25章 注解 331
第26章 使用XM L 335
第27章 使用对象的模块化编程 345
第28章 对象相等性 355
第29章 结合Scala和Java 373
第30章 Actor和并发 383
第31章 连结符解析 407
第32章 GUI编程 427
第33章 Scell试算表 435
附录A Unix和Windows的Scala脚本 453
术语表 455
参考文献 465
关于作者 467
索引 469
图示清单 18
图2.1 Scala函数的基本构成 18
图2.2 Scala函数字面量的语法 22
图3.1 Scala里所有的操作符都是方法调用 24
图3.2 Scala的Set类层级 30
图3.3 Scala的Map类层级 31
图10.1 ArrayElement的类关系图 116
图10.2 LineElement的类关系图 120
图10.3 布局元素的类层级 121
图10.4 修改了LineElement后的类层级 124
图11.1 Scala类层级图 132
图12.1 Cat类的继承层级和线性化次序 147
图14.1 ScalaTest的图形报表器 169
图17.1 Scala集合类型的类层级 215
图17.2 Iterator的类层级 216
图18.1 基本门电路 237
图18.2 半加法电路 238
图18.3 全加法电路 239
图19.1 函数类型参数中的协变与逆变 261
图22.1 Scala列表的类层级 302
图22.2 展示的Scala列表构造 304
图32.1 一个简单的Swing应用程序:初始状态(左)和拉大之后的状态(右) 428
图32.2 一个有反应的Swing应用程序:初始状态(左)及点击后的状态(右) 429
图32.3 摄氏度与华氏度之间的转换器 432
图33.1 一个简单的试算表表格 436
图33.2 显示自身的单元格 439
图33.3 显示方程式的单元格 444
图33.4 可以求值的单元格 448
表格清单 27
表3.1 List的一些方法和作用 27
表5.1 一些基本类型 47
表5.2 特殊字符字面量转义序列 50
表5.3 操作符优先级 59
表5.4 一些富操作 60
表5.5 富包装类 60
表12.1 Cat层级中类型的线性化 148
表13.1 LegofJourney.distance上的私有限定符效果 159
表16.1 基本列表操作 195
表17.1 集的常用操作 222
表17.2 映射的常用操作 223
表17.3 默认的不可变集实现 225
表17.4 默认的不可变映射实现 225
表31.1 解析器连结符汇总 415
代码清单 23
清单3.1 用类型参数化数组 23
清单3.2 创造和初始化数组 25
清单3.3 创造和初始化列表 26
清单3.4 创造和使用元组 28
清单3.5 创造、初始化和使用不可变集 29
清单3.6 创建、初始化和使用可变集 30
清单3.7 创造、初始化和使用可变映射 31
清单3.8 创造、初始化和使用不可变映射 32
清单3.9 没有副作用或var的函数 33
清单3.10 从文件中读入行 34
清单3.11 对文件的每行记录打印格式化的字符数量 36
清单4.1 类ChecksumAccumulator的最终版 40
清单4.2 类ChecksumAccumulator的伴生对象 42
清单4.3 程序Summer 43
清单4.4 使用Application特质 45
清单6.1 带字段的Rational 64
清单6.2 带有从构造器的Rational 66
清单6.3 带私有字段和方法的Rational 67
清单6.4 带操作符方法的Rational 68
清单6.5 含有重载方法的Rational 71
清单7.1 在Scala里根据条件做初始化的惯例 74
清单7.2 用while循环计算最大公约数 74
清单7.3 用do-while从标准输入读取信息 75
清单7.4 使用递归计算最大公约数 75
清单7.5 用for表达式列举目录中的文件 76
清单7.6 用带过滤器的for发现.scala文件 77
清单7.7 在for表达式中使用多个过滤器 78
清单7.8 在for表达式中使用多个发生器 78
清单7.9 在for表达式里的流间赋值 78
清单7.10 用for把Array[File]转换为Array[Int] 79
清单7.11 Scala的try-catch子句 80
清单7.12 Scala的try-finally子句 81
清单7.13 能够产生值的catch子句 82
清单7.14 有副作用的match表达式 82
清单7.15 生成值的match表达式 83
清单7.16 不带break或continue的循环 84
清单7.17 不用var做循环的递归替代方法 84
清单7.18 打印乘法表时的变量范围 85
清单7.19 创建乘法表的函数式方法 87
清单8.1 带私有的processLine方法的LongLines对象 89
清单8.2 带局部processLine方法的LongLines 91
清单9.1 使用闭包减少代码重复 105
清单9.2 定义和调用“陈旧的”函数 107
清单9.3 定义和调用柯里化的函数 107
清单9.4 使用借贷模式写文件 110
清单9.5 使用传名参数 111
清单10.1 定义抽象方法和类 114
清单10.2 定义无参数方法width和height 114
清单10.3 定义ArrayElement为Element的子类 116
清单10.4 用字段重写无参数方法 117
清单10.5 定义contents为参数化字段 118
清单10.6 调用超类构造器 119
清单10.7 声明final方法 123
清单10.8 声明final类 123
清单10.9 带有above、beside和toString的类Element 126
清单10.10 带有工厂方法的工厂对象 127
清单10.11 重构以使用工厂方法的类Element 127
清单10.12 用私有类隐藏实现 128
清单10.13 有了widen和heighten方法的Element 129
清单10.14 Spiral程序 130
清单12.1 Philosophical特质的定义 137
清单12.2 使用extends混入特质 137
清单12.3 使用with混入特质 138
清单12.4 混入多个特质 138
清单12.5 定义丰满了的特质 141
清单12.6 抽象类IntQueue 143
清单12.7 使用ArrayBuffer实现BasicIntQueue 143
清单12.8 Doubling可堆叠改动特质 144
清单12.9 在使用new实例化的时候混入特质 145
清单12.10 可堆叠改动特质Incrementing和Filtering 145
清单13.1 把文件的全部内容放进包里 151
清单13.2 同一个文件嵌入不同的包 152
清单13.3 较少缩进的嵌入包 152
清单13.4 Scala的包确实是嵌套的 152
清单13.5 访问隐藏的包名 153
清单13.6 鲍勃最爱的水果,已为引用做好准备 154
清单13.7 引用规范的(不是单例)对象的成员 154
清单13.8 引用包名 155
清单13.9 Scala和Java的private访问差异 157
清单13.10 Scala和Java的protected访问差异 157
清单13.11 使用访问修饰词的灵活的保护作用域 158
清单13.12 访问伴生类和对象的私有成员 160
清单14.1 使用断言 161
清单14.2 使用ensuring断言函数结果 162
清单14.3 使用Suite编写测试方法 162
清单14.4 使用FunSuite编写测试函数 163
清单14.5 使用JUnit3Suite编写JUnit测试 165
清单14.6 使用TestNGSuite编写TestNG测试 165
清单14.7 使用ScalaTest的Spec规格化和测试行为 166
清单14.8 使用specs架构规格化和测试行为 167
清单14.9 使用ScalaCheck编写基于属性的测试 167
清单14.10 使用Checkers在JUnit的TestCase里检查属性 168
清单15.1 定义样本类 171
清单15.2 simplifyTop函数,使用了模式匹配 173
清单15.3 带有空“默认”情况的模式匹配 174
清单15.4 使用通配模式的模式匹配 174
清单15.5 使用常量模式的模式匹配 175
清单15.6 使用变量模式的模式匹配 175
清单15.7 带有构造器模式的模式匹配 176
清单15.8 有固定长度的序列模式 177
清单15.9 匹配任意长度的序列模式 177
清单15.10 带有元组模式的模式匹配 177
清单15.11 带有类型化模式的模式匹配 177
清单15.12 使用isInstanceOf和asInstanceOf(不好的风格) 178
清单15.13 带有变量绑定(用@符号)的模式 180
清单15.14 带有模式守卫的match表达式 180
清单15.15 样本依次被调用的匹配表达式 181
清单15.16 封闭了的样本类层级 182
清单15.17 用一个赋值语句定义多个变量 184
清单15.18 带有元组模式的for表达式 186
清单15.19 从列表中拣出匹配于模式的元素 187
清单15.20 表达式格式化器的上半截 189
清单15.21 表达式格式化器的下半截 190
清单15.22 输出格式化了的表达式的应用程序 191
清单16.1 List类的归并排序 203
清单17.1 Predef中定义的默认映射和集 221
清单17.2 混入SynchronizedMap特质 226
清单18.1 可变的银行账号类 233
清单18.2 带有公开var变量的类 235
清单18.3 公开的var变量是如何扩展为getter和setter方法的 235
清单18.4 直接定义getter和setter方法 236
清单18.5 定义不带关联字段的getter和setter 236
清单18.6 halfAdder方法 239
清单18.7 fullAdder方法 239
清单18.8 Simulation类 240
清单18.9 BasicCircuitSimulation类的前半部分 243
清单18.10 BasicCircuitSimulation类的后半部分 244
清单18.11 CircuitSimulation类 246
清单19.1 基本的函数式队列 251
清单19.2 通过私有化隐藏主构造器 251
清单19.3 伴生对象的apply工厂方法 252
清单19.4 数式队列的类型抽象 253
清单19.5 非协变(严谨)的Cell类 254
清单19.6 带有下界的类型参数 258
清单19.7 逆变的输出通道 259
清单19.8 Functionl的协变和逆变 260
清单19.9 函数类型参数变化型的演示 261
清单19.10 优化了的函数式队列 262
清单19.11 混入了Ordered特质的Person类 263
清单19.12 带有上界的归并排序 264
清单20.1 重写的抽象val及无参方法 267
清单20.2 声明抽象var 267
清单20.3 抽象var是如何被扩展为getter和setter方法的 267
清单20.4 使用了抽象val的特质 268
清单20.5 匿名类表达式中的预初始化字段 269
清单20.6 对象定义中的预初始化字段 270
清单20.7 类定义中的预初始化字段 270
清单20.8 使用懒加载val初始化特质 271
清单20.9 用抽象类型建模合适的食物 274
清单20.10 在子类中实现抽象类型 274
清单20.11 美国货币区域 281
清单20.12 欧洲和日本的货币区域 282
清单20.13 带有汇率表的转换器对象 282
清单20.14 CurrencyZone的完整代码 283
清单21.1 带多个参数的隐式参数列表 293
清单21.2 带有上界的函数 294
清单21.3 带有隐式参数的函数 295
清单21.4 使用了内部隐式参数的函数 296
清单21.5 带有视界的函数 297
清单21.6 使用隐式参数的样例代码 299
清单21.7 完成类型检查和隐式内容插入之后的样例代码 299
清单22.1 Nil单例对象的定义 302
清单22.2 在子类型列表上前缀超类型元素 304
清单22.3 List类的::(cons)方法定义 304
清单22.4 List类的:::方法定义 305
清单22.5 List类的map方法定义 306
清单22.6 List子类::的定义 307
清单24.1 EMail字符串抽取器对象 322
清单24.2 Twice字符串抽取器对象 324
清单24.3 UpperCase字符串抽取器对象 324
清单24.4 Domain字符串抽取器对象 325
清单24.5 ExpandedEMail抽取器对象 326
清单24.6 定义了unapplySeq方法的抽取器 327
清单24.7 RichString是如何定义r方法的 329
清单27.1 简化的Food实体类 346
清单27.2 简化的Recipe实体类 347
清单27.3 可以用于测试的Food和Recipe例子 347
清单27.4 仿制的数据库和浏览器模块 347
清单27.5 添加了类别的数据库和浏览器模块 348
清单27.6 带抽象数据库val字段的Browser类 349
清单27.7 带抽象方法的Database类 349
清单27.8 Database的子类对象SimpleDatabase 350
清单27.9 Browser子类对象SimpleBrowser 350
清单27.10 学生数据库与浏览器 350
清单27.11 食品分类的特质 351
清单27.12 混入了FoodCategories特质的Database 351
清单27.13 仅由混入组成的SimpleDatabase对象 351
清单27.14 SimpleFoods特质 351
清单27.15 带有自身类型的SimpleRecipes 352
清单27.17 使用单例类型 354
清单28.1 调用canEqual的超类equals方法 363
清单28.2 调用canEqual的子类equals方法 364
清单28.3 二叉树的类继承关系 365
清单28.4 带有equals和hashCode方法的参数化类型 368
清单28.5 带有equals和hashCode的Rational类 369
清单29.1 声明了Java throws语句的Scala方法 376
清单30.1 一个简单的actor 384
清单30.2 调用receive的actor 386
清单30.3 调用react的actor 389
清单30.4 使用loop的actor方法act 389
清单30.5 使用助手actor来避免阻塞自己的actor 391
清单30.6 使用样本类作为消息的actor 394
清单30.7 Simulant特质 399
清单30.8 加法器组件 404
清单31.1 一个算术表达式解析器 408
清单31.2 针对Java标识符的正则表达式解析器 410
清单31.3 JSON格式的数据 411
清单31.4 一个简单的JSON解析器 411
清单31.5 返回有意义的结果的完整JSON解析器 414
清单31.6 ~连结符方法 419
清单32.1 一个用Scala编写的简单Swing应用程序 427
清单32.2 在面板上组装组件 429
清单32.3 实现一个有反应的Swing应用程序 432
清单32.4 温度转换器的一个实现 433
清单33.1 图33.1中的试算表的代码 436
清单33.2 试算表应用程序的主程序 437
清单33.3 带有rendererComponent方法的试算表 438
清单33.4 第一版的Model类 438
清单33.5 代表公式的类 440
清单33.6 解析公式的试算表 443
清单33.7 Evalutor特质的evaluate方法 445
清单33.8 一个算术操作库 446
清单33.9 完成的试算表组件 451