深入理解Scala

出版日期:2014-12
ISBN:9787115365547
作者:[美] Joshua D. Suereth 苏瑞茨 著
页数:288页

内容概要

Josh Suereth 是Typesafe公司的一名软件工程师,它是Scala的Committer之一,也是scala-tools.org的维护者

书籍目录

第1章 Scala——一种混合式编程语言 1
1.1 Scala的设计哲学 1
1.2 当函数式编程遇见面向对象 3
1.2.1 重新发现函数式概念 4
1.2.2 Google Collections中的函数式概念 6
1.3 静态类型和表达力 8
1.3.1 换边 8
1.3.2 类型推断 9
1.3.3 抛开语法 10
1.3.4 隐式转换概念早已有之 11
1.3.5 使用Scala的implicit关键字 12
1.4 与JVM的无缝集成 13
1.4.1 Scala调用Java 13
1.4.2 Java调用Scala 14
1.4.3 JVM的优越性 15
1.5 总结 16
第2章 核心规则 17
2.1 学习使用Scala交互模式(REPL) 17
2.1.1 实验驱动开发 19
2.1.2 绕过积极(eaglerly)解析 20
2.1.3 无法表现的语言特性 21
2.2 优先采用面向表达式编程 22
2.2.1 方法和模式匹配 23
2.2.2 可变性 24
2.3 优先选择不变性 26
2.3.1 判等 27
2.3.2 并发 31
2.4 用None不用null 34
2.5 多态场景下的判等 38
2.5.1 例子:时间线库 38
2.5.2 多态判等实现 40
2.6 总结 43
第3章 来点样式—编码规范 44
3.1 避免照搬其他语言的编码规范 45
3.2 空悬的操作符和括号表达式 48
3.3 使用有意义的命名 50
3.3.1 命名时避免$符号 51
3.3.2 使用命名和默认参数 53
3.4 总是标记覆盖(overriden)方法 56
3.5 对期望的优化进行标注 61
3.6 总结 66
第4章 面向对象编程 68
4.1 限制在对象或特质的body里初始化逻辑的代码 68
4.1.1 延迟构造 69
4.12 多重继承又来了 70
4.2 为特质的抽象方法提供空实现 71
4.3 组合可以包含继承 76
4.3.1 通过继承组合成员 79
4.3.2 经典构造器with a twist 80
4.3.3 总结 82
4.4 提升抽象接口为独立特质 82
4.4.1 和接口交互 84
4.4.2 从历史中吸取教训 85
4.4.3 结论 86
4.5 public接口应当提供返回值 86
4.6 总结 88
第5章 利用隐式转换写更有表达力 89
5.1 介绍隐式转换系统 90
5.1.1 题外话:标识符 91
5.1.2 作用域和绑定 93
5.1.3 隐式解析 97
5.1.4 通过类型参数获得隐式作用域 99
5.1.5 通过嵌套获得隐式作用域 100
5.2 隐式视图:强化已存在的类 101
5.3 隐式参数结合默认参数 106
5.4 限制隐式系统的作用域 112
5.4.1 为导入创建隐式转换 112
5.4.2 没有导入税(import tax)的隐式转换 114
5.5 总结 118
第6章 类型系统 119
6.1 类型 120
6.1.1 类型和路径 121
6.1.2 type关键字 123
6.1.3 结构化类型 124
6.2 类型约束 130
6.3 类型参数和高阶类型(Higher Kinded Types) 133
6.3.1 类型参数约束 133
6.3.2 高阶类型 134
6.4 型变(Variance) 136
6.5 存在类型 143
6.6 总结 148
第7章 隐式转换和类型系统结合应用 149
7.1 上下文边界和视图边界 149
7.2 用隐式转换来捕捉类型 152
7.2.1 捕获类型用于运行时计算(capturing types for runtime evaluation) 152
7.2.2 使用Manifest 153
7.2.3 捕捉类型约束 154
7.2.4 特定方法(Specialized method) 156
7.3 使用类型类 (type class) 158
7.3.1 作为类型类的 FileLike 161
7.3.2 类型类的好处 164
7.4 用类型系统实现条件执行 165
7.4.1 异构类型List 167
7.4.2 IndexedView 170
7.5 总结 177
第8章 Scala集合库 178
8.1 使用正确的集合类型 179
8.1.1 集合库继承层次 179
8.1.2 Traversable 180
8.1.3 Iterable 184
8.1.4 Seq 185
8.1.5 LinearSeq 186
8.1.6 IndexedSeq 188
8.1.7 Set 189
8.1.8 Map 189
8.2 不可变集合 191
8.2.1 Vector 191
8.2.2 List 193
8.2.3 Stream(流) 194
8.3 可变集合 197
8.3.1 ArrayBuffer 197
8.3.2 混入修改事件发布特质 198
8.3.3 混入串行化特质 198
8.4 用视图和并行集合来改变计算策略 199
8.4.1 视图 200
8.4.2 并行集合 201
8.5 编写能处理所有集合类型的方法 204
8.6 总结 209
第9章 Actors 210
9.1 使用Actor的时机 210
9.2 使用有类型的、透明的引用 214
9.3 把故障限制在故障区里 219
9.3.1 发散搜集故障区 219
9.3.2 通常的故障处理实践 222
9.4 利用排期区控制负载 223
9.5 动态Actor拓扑 226
9.6 总结 231
第10章 Scala和Java集成 232
10.1 Scala/Java不匹配 233
10.1.1 基础类型自动打包的差异 234
10.1.2 可见性的差异 238
10.1.3 不可表达的语言特性 239
10.2 谨慎使用隐式转换 242
10.2.1 对象标识和判等 242
10.2.2 链式隐式转换 244
10.3 小心Java序列化 246
10.4 注解你的注解 250
10.4.1 注解目标 252
10.4.2 Scala和静态属性 253
10.5 总结 254
第11章 函数式编程 255
11.1 计算机科学领域的范畴论 255
11.2 函子(Functor), Monad及它们与范畴的关系 259
11.3 咖喱化和可应用风格(Applicative style) 264
11.3.1 咖喱化 265
11.3.2 可应用风格 267
11.4 用作工作流的单子 270
11.5 总结 274

作者简介

本书由Scala之父作序推荐,深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书示例丰富,是目前为止该领域最好的参考书籍,非常适合有经验的Scala程序员向专家水平进阶的参考读物。本书适合想要了解Scala语言的底层机制和技术细节的读者阅读参考,是学习Scala语言的上上之选择。
Scala是一种多范式的编程语言,它既支持面向对象编程,也支持函数式编程的各种特性。
本书深入探讨了Scala里几个较为复杂的领域,包括类型系统的高阶内容、隐式转换、特质的组合技巧、集合、Actor、函数式编程的范畴论等,而且不是干巴巴地讲述语言和库的概念。本书充满各种实用的建议和最佳实践,可以来帮助读者学习怎样把Scala里较少被掌握的部分应用到工作中。
本书不是Scala的入门级教程,而是适合有经验的Scala程序员向专家水平进阶的参考读物。本书适合想要了解Scala语言的底层机制和技术细节的读者阅读参考。
专业书评
“权威并且易于理解”。——Martin Odersky Scala之父
“带你深入Scala的内部工作机制”。——John C Tyler PROS Pricing
“目前为止,我在技术书里读到过的最好的示例”。——Eric Weinberg Wagger Designs
“一本开拓眼界的书,现在我对Scala知其所以然了”。——John Criffin Hibernate Search in Action合著者


 深入理解Scala下载 更多精彩书评



发布书评

 
 


精彩书评 (总计1条)

  •     P18scala> "Hello".filter(_ != 'l')res1: String = Hello应为scala> "Hello".filter(_ != 'l')res1: String = HeoP19译文:领域特定语言是用于特定领域的伪编程语言,这种语言专门用来解决手头的某个领域。建议:领域特定语言是用于特定领域的伪编程语言,这种语言专门用来解决手头的某个领域的问题。原文:A DSL is pseudo programming language that deals with a particular domain.P19而且能帮助你确定你得表达式是否能编译。"得" -> "的"P45译文:很多 Scala 用户来自 Java 和 Ruby 语言,建议:很多 Scala 用户来自 Java 和 Ruby 语言阵营,P71译文:早期成员定义解决的问题是当特质定义抽象成员并且其具体成员依赖此抽象成员时发生的。原文:Early member definitions solve issues that occur when a trait defines an abstract value and relies on it in other concrete values.这里的 value 翻译成 成员 很赞。P72`def handleMessage(msg: SimulationMessage, ctx: Simulation)` -> `def handleMessage(msg: SimulationMessage, ctx: SimulationContext)`P73排版问题:`译者注`可以加黑处理,但是接下来的"Scala的特质有个非常有用的..."这段不属于`译者注`,不应该加黑。P74`trait NetworkENtity` -> `trait NetworkEntity`P74值得商榷的地方1. 如图 4.2 所示,MixableParent 紧跟在 NetworkEntity 后调用,As you can see, the MixableParent class is being called directly after NetworkEntity 2. 但是在 Router 之前。这意味着 NetworkEntity (译者注:应该是 Router) 中的行为不会被调用,but before Router. This means that the behavior in NetworkEntity is never called 3. 因为 MixableParent 不调用其超类!这意味着我们需要想个办法把 MixableParent(译者注:应该为 Router)移到线性化的前面去。because the MixableParent doesn’t call its super! Therefore, we have to find a way of getting MixableParent earlier in the linearization. 4. 因为 Scala 的线性化是从右往左,也就是说我们得创建个 MixableParent with Router with NetworkEntity,Because things linearize right to left in Scala, we want to try creating a MixableParent with Router with NetworkEntity. 5. 这首先需要我们把 Router 变成特质。在现实中这不一定可行,但我们就继续练习,我们来看看在 REPL 里会是什么效果。That first requires turning the Router class into a trait. This might not be feasible in real life, but let’s continue the exercise. We’ll see what this looks like in a Scala REPL session这段是针对上一段的 Router with NetworkEntity 说的针对 2 ,因为 NetworkEntity 是 extend MixableParent 的,那么在 Router <-- NetworkEntity <-- MixableParent 中最先调用的就是 MixableParent,而 MixableParent 中没有调用 super.handleMessage,所以原文说 “这意味着 NetworkEntity 中的行为不会被调用,”我认为是对的。针对 3 ,我也认为原文的"我们需要想个办法把 MixableParent 移到线性化的前面的"是对的,我个人认为"线性化"的"前面"是指靠左边,而执行是从线性化的后面,即靠右边 开始的。最后这个 "线性化"表示为 MixableParent <-- Router <-- NetworkEntity。像这样 MixableParent with Router with NetworkEntity 的话 Router 的功能就得到了调用,而 Router with NetworkEntity 是做不到的。当然最后,原文也说了"同时 Router 特质存在跟 MixableParent 一样的问题 -- 不代理给父类!在我们的案例里是可以的,因为 Router 是个实体,是被混入其他行为的(而不像一般的 trait是用来混入其他实体的)"(P76)。这段也说明了在线性化 MixableParent <-- Router <-- NetworkEntity 中,调用在 Router 时就断了 MixableParent 也不会被调用了。P77清单 4.7 这个代码是编译不通过的,trait Logger 有一个 def log,但是在 trait DataAccess 中只写了 val logger = new Logger。P79清单 4.10 trait RemoteLogger 在复写 log 方法时 需要再前面加上 override。P80标题“经典构造器 with a twist”,原文“classic constructors with a twist”,这个真心不好翻,不如保留原文吧。P824.3.3 总结在 Scala 里有很多做“组合”的新方法,我的建议是选择......请确保在完全理解后再决定您的组合策略。这段不是总结,而正文的一部分。原版中在这段下面还有一段“总结”,译文版中丢失了。In section 11.3.2, we show an alternative means of composing objects using a func- tional approach. Although the concepts behind this approach are advanced, the approach offers a good middle ground between using constructors with default argu- ments and abstract member composition.P84译文:最有趣的这个类不但编译通过而且还能运行建议:最有趣的是这个类不但编译通过而且还能运行P84译文:请注意这些类成功的链接建议:请注意这些类成功地链接原文:Notice that the classes link fine;P84译文:好吧,如果我们真相调用默认实现建议:好吧,如果我们真想调用默认实现P86译文:4.5 public 接口应当提供返回值原文:4.5 Provide return types in your public APIs个人认为 接口 还是直接用 API 表示比较好,程序员都懂的。P884.6 总结为避免泄漏...那部分代码这段不是总结,而是正文的一部分。缺少原文中真正的一段总结。Scala’s object system is powerful and elegant. The body...This leads to the best use of objects in Scala.P99trait BinaryFormat[T] {def asBinary(entity: T): Array[Bytes]}这里的 Bytes 应该是 Byteobject Foo {...def asBinary(entity: Foo) = "serializedFoo".toBytes...}这里的 toBytes 应该是 getBytesP105译文:当然最好是对应用做一些探测(profile)来确定关键区域,而不是假定 HotSpot 会处理分配问题。原文:Again, it’s best to profile an application to deter- mine critical regions rather than assuming HotSpot will take care of allocations.个人认为 profile 翻译成 探测 不好,见<http://en.wikipedia.org/wiki/Profiling_(computer_programming)>,之前见网上一些翻译成 性能分析 。P106译文:Scala 隐式视图给用户...隐式视图能极大地减轻整合多个类似但又小区别的接品时的痛苦,这里的“又”应该为“有”P121Scala 里的类型通过相对的绑定或路径来引用(type within scala arereferenced related to a bingidng or path)。这段的英文里 arereferenced 印刷时写一起了。P122清单 6.2 中的class Outer {...def bar(x: X#Inner) = null}这里的 X 应为 Outer。P125清单 6.3 中的scala> Resource.close(System.in)这里的 close 应为 closeResourceP128这页开头的代码示例中缺少 callbacks 的定义。我自己用 `private var callbacks = Map[Handle, this.type => Unit]()`可行。P131译文:因为 Scala 是一种多态的面向对象语言(译者注:这里应该是指 scala 支持泛型)原文:Because Scala is a polymorphic object-oriented language,在 Coursera 上 Martin Odersky 讲的 Functional Programming Principles in Scala 中 Week 4: Types and Pattern Matching 的 Lecture 4.1 - Polymorphism 里有这样说Polymorphism means that a function type comes "in many forms".In programming it means that- the function can be applied to arguments of many types, or- the type can have instances of many types.We have seen two principal forms of polymorphism:- subtyping: instances of a subclass can be passed to a base class- generics: instances of a function or class are created by type parameterization.结合后文,“多态意味着当需要编译时类型为 Traversable 时,可以使用 Set 类的实例,类为 Set 类继承了 Traversable。”所以,我认为原文这里的 polymorphism 还是应该指 subtyping,也就是一般我们说的“多态”。P161译文:编译器报告 FIleLike.childrenFIleLike -> FileLikeP178译文:一眼看去可能会吓到。建议:一眼看去可能会被吓到。译文:因此理解不同集合类型的性能和使用模式就是变得非常重要了。建议:因此理解不同集合类型的性能和使用模式就变得非常重要了。P183译文:在 Scala 里,有些控制流,比如非局部的 closure 返回 (non-local closure return)和 break 语句,是通过继承 scala.util.control.ControlThrowable 来实现的。读者在读到这句话时可能会非常不理解,什么是 non-local closure return 呢? 到底是怎么继承 ControlThrowable 来实现的呢?建议做一个译者注,比如写一个 non-local closure,object Test {def closure(xs: List[Int]): Int = {var rec = 0for (x <- xs) {if (x == 0) {return rec}rec += x}rec}}然后 scalac 编译成 class 后,反编译看下就知道,反编译代码里有类似这样的"throw new NonLocalReturnControl.mcI.sp(this.nonLocalReturnKey1$1, Test..this.elem);",而这个 NonLocalReturnControl 就是继承 ControlThrowable 的。P184scala> val addresss = ...address 的复数形式貌似是 addresses。P189译文: 最大的区别在于 HashSet 用用元素的 hash 值..."用用" --> "用"P196这一页第一个代码块和第三个代码块重复了,第一个代码块在原文中是scala> fibs drop 3 take 5 toListres0: List[Int] = List(2, 3, 5, 8, 13)scala> fibsres1: Stream[Int] = Stream(0, 1, 1, 2, 3, 5, 8, 13, ?)P197原文:并且要知道那个方法是操作当前集合的值而不是创建个新集合“那” --> “哪”P1988.3.2 节这个例子无法模拟,evt: Message[Int] with Undoable 不知道是什么意思?P203scala> (1 to 1000).par.foldLeft(Set[String]()) {| (set,value) =>| set + Thread.currentThread.toString()| }这里的 set + Thread.currentThread.toString() 应为 set :+ Thread.currentThread.toString()P209原文:所以在考虑要把一个针对集合的方法写到多抽象时需要认真取舍建议:所以在考虑要把一个针对集合的方法写到多么抽象时需要认真取舍

精彩短评 (总计19条)

  •     翻译的实在。。。有种读不下去的感觉,不知道译者有没有自己通读过一遍。
  •     对 Scala 的一些核心概念讲解的很透彻,没有基本概念的罗列,直入核心,有一定 Scala 基础的话理解起来会更顺畅!
  •     国内也没几本书,拿来入入门
  •     不适合入门!初学者千万不要买;一上来没有讲基础的语法 让人看得云里雾里, 打击学习积极性!
  •     内容覆盖挺不错的。翻译略差。 适合有基础的人员
  •     不错的资料,但不是最佳选择。
  •     再看了一遍,内容很丰富,延展很多
  •     先看的Programming in Scala 再看这个,收获挺大
  •     翻译的太拗口了........
  •     抛开翻译,只说本书内容,囫囵吐糟,千万别当作入门书,坑死,很多地方讲的非常模糊!然而进阶都这种书就更没有必要了!强烈不建议入手!
  •     一般吧~ 基本上programming in scala 和 快学scala看完,再看点博客,这本书的内容基本上涵盖了。
  •     翻译的什么鬼。。。。
  •     涉及到的主题不多,但是每个主题都讲的非常深入,适合Scala中级开发者学习,建议先看快学Scala,再看这本书。
  •     不想读了
  •     读了第二遍,有些还是没法理解,建议学一下基础的,再看这本
  •     对于深入了解Scala的内部机制和高级用法非常有用。书中对隐式定义和类型类等的讲解非常清楚,例子也较适中,适合具有Scala基础的Scala爱好者。
  •     比手册写的好;
  •     书的内容挺不错,主要介绍了一些高级话题,但不适合入门。类型系统那几章很有意思,写得也比较清楚。主要的问题:中文版书中的错误非常非常多,代码和文字中都有,部分是英文原版书中存在的,但大多数是翻译带来的,书的语言也不是很好,看着比较累。
  •     译者有没有上过学啊,翻译的比书中代码还难懂
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024