《Programming in Scala》读书笔记

人盡茶涼 提交于 2019-11-27 01:10:48
  不得不感叹一下,这本书真的是神作,不愧是Scala语言作者自己写的书。整个书的内容条理非常清晰,对于有些地方的设计也给出了具体的原因,能让你对整个语言有更好的把握。深入学习Scala必读书籍,强烈推荐!
    另外不得不发一下牢骚,这本书出来都几年了,中文翻译很久之前就开始在做,结果一直没见到影子。无奈又特别想看这本书,但英文原版书籍在国内买不到,实在没办法就去买了个印刷的盗版。正当我读了没几天,居然就在我写这个博文时得到消息,中文版出来了,我的个汗啊...还好英文版的也很好懂,其实还是蛮喜欢读原版书籍的,有些书的译本挺不负责任的,不知道这本中文版如何。希望这本书能让国内开始风靡Scala,现在真是个人大爱啊,就想要个静态编译的函数式语言,基本就没什么可以选的了。
    言归正传,以下只是个人的读书笔记,就记录自己比较关心的要点。由于看的原版书籍,很多地方就直接用e文了,我也不是搞翻译的,一人一个中文翻译名词更让人摸不到头脑。
 

Chapter 1. A Scalable Language

1. 使得Scala拥有扩展性的原因:
(1) 更加OO的方式
(2) Functional
2. Scala的特性:
(1) 与Java的兼容性
(2) 简洁
(3) 更高层次的抽象
(4) 静态类型
 

Chapter 5. Basic Types and Operations

1. 数字的数据类型和Java基本都一样。String型在声明可以用""",不会转义。
2. 比较有意思的是换行还能对齐,例如:
println("""|line one
           |line two""".stripMargin)
3. 操作符都是函数方法,用unary声明的,比如:+是unary_+方法。
4. 比较牛逼的地方是优先级做的很好,和数学上是一样的,用起来非常方便;另外数据类型转换也是自动的。
5. 需要注意的一点是==含义是比较值,与Java的equals是一样的;Scala的eq方法与Java的==是一样的。
 

Chapter 6. Functional Objects

1. 尽量使用不可变对象,优点:
(1) 只会有简单的改变数据的原因
(2) 使用起来可以很自由
(3) 多线程的协同性更好
(4) 拥有安全的hashtable keys
缺点:需要维护一个对象图,当数量过大可能会有些性能问题。
2. class中可以有require方法做参数检查。
3. 多个构造器只能分开写,一个主构造其在声明class的地方写,其他辅助构造器写在class里面,且只能放在其他方法前面。
4. 遇到与保留字冲突时,可以使用``来让系统识别。
5. implicit可以声明系统自动调用的方法。
 

Chapter 7. Built-in Control Structures

1. if没啥好说的。
2. while循环是作者特别保留下来的,其实正统的函数式语言是不需要这个的,但是作者考虑到有些时候用循环还是更直观。另外需要注意一下,Scala是没有break和continue的,只能用if,其实用if改写以后代码会更漂亮。
3. For就做的太牛逼了,大概有这么些特性: 
(1) Iteration through collections,eg:for(value <- list)
(2) Filter,eg:for(value <- list if value > 0)
(3) Nested iteration,eg:for(v1 <- list1; v2 <- list2)
(4) Mid-stream variable bindings,eg:
    for{ v1 <- list1
         v1 += 1
         v2 <- list2
    } ...
(5) Producing a new collection,eg:
    val newList =
        for{
            value <- list
            if value > 0
        } yield value
4. Throw出来的Exception是Nothing类型的,外层代码可以安全使用。
5. 强大的Pattern Match,用起来很爽,比Java的switch强太多。
 

Chapter 8. Functions and Closures

1. 尽量把仅调用一次的Helper方法内嵌到使用方法内,Scala支持方法嵌套。
2. Fuction是open term的,Closure是closed term。尽量使用Function来增强上下文无关性。
3. 有很多函数简化的写法,但是要慎重使用以免影响可读性。
 

Chapter 9. Control Abstraction

1. 使用函数作为参数可以减少代码的重复。
2. 使用Collections自带的方法可以简化代码。
3. Curry可以使代码更结构化。
4. Loan Pattern来封装finally操作。
 

Chapter 10. Composition and Inheritance

1. 支持uniform access principle,只要把父类中的def方法改成val即可。
2. 对于有side effect的方法,建议不要去掉空括号,比如println()。
3. Scala只有两个namespace,分别是values(fields, methods, packages, and singleton objects)和types(class and trait names),所以不能存在如同名的field和method。
4. override强制要求声明。
5. 子类override父类方法可以简写成:
  class Dog( override val name: String ) extends Animal
6. 子类可以直接使用父类构造器的参数,例如:
  class LineElement( s: String ) extends ArrayElement( Array(s) ) { 
      override def width = s.length
  }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!