《Programming in Scala》讀書筆記

  不得不感嘆一下,這本書真的是神做,不愧是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
  }
相關文章
相關標籤/搜索