9/20にScalaスケーラブルプログラミングの第3版が出版されて、しかも第3版から電子書籍にも対応したので、早速入手した。

せっかくなんで、手元の第2版と読み比べして、差分をメモってく。

第11章〜第20章はこっち


第01章 スケーラブルな言語

なし

第02章 Scalaプログラミングの第一歩

なし

第03章 Scalaプログラミングの次の一歩

なし

第04章 クラスとオブジェクト

4.2 クラス、フィールド、メソッド

結果型の省略に関して、クラス内で宣言されたpublicメソッドの結果型を明示的に提示することが適切な方法、と紹介されている。

4.5 Appトレイト

scala.Applicationトレイトは、コマンドライン引数を使えなかったが、scala.Appトレイトはargsという名前の文字列の配列を指定しておけば、コマンドライン引数にアクセスできる。

こんな感じ

object Sample extends App {
  for(arg <- args) {
    println(s"arg: $arg")
  }
}
scala Sample hoge fuga
> arg: hoge
> arg: fuga

第05章 基本型と演算子

5.1 基本型

Javaのプリミティブ型に対応するScalaのvalue typeで、小文字の別名についての言及がなくなった。

2.8では、↓と書いても自動的にScalaのvalue typeと同じように扱われていたらしい。

val i:int = 1
val f:float = 1f
val d:double = 1d

2.11だとコンパイルエラーになる。

5.2 リテラル

Javaプログラマーのための近道で、読んでおいた方がよいScalaのリテラルに、文字列補間(5.3節)が追加された。 8進数の整数リテラルをサポートしていない記載が追加された。(コードサンプルも追随している)

5.3 文字列補間

5.3節 文字列補間 が追加された。

s文字列補間子

val name = "reader"
println(s"Hello, $name!")
> Hello, reader!

raw補間子

s補間子と同様に扱えるが、文字列リテラルのエスケープシーケンスを認識しない。

println(raw"No\\\\escape!")
> No\\\\escape!

ちなみにs補間子だと、

println(s"No\\\\escape!")
> No\\escape!

f補間子

対象の式に出力書式を指定することができる。指定する場合は、対象の式に続いてパーセント記号(%)と書式指定の構文(java.util.Formatterで定義されていりもの)を記述する。

f"${math.Pi}%.5f"
> res0: String = 3.14159

出力書式の構文が指定されていない場合、デフォルトでは%sと認識されtoString値が代入される。

5.6 関係演算子と論理演算子

def salt:Boolean = { println("salt"); false }
def pepper:Boolean = { println("pepper"); true }

salt&&pepper

> salt
> res0: Boolean = false

この場合、salttrueなら、pepperが呼び出されることはない。

どうしても、式の右辺(この場合pepper)を評価したいのなら、代わりに&|を使う。

salt&&pepper

> salt
> pepper
> res0: Boolean = false

第06章 関数型スタイルのオブジェクト

なし

第07章 組み込みの制御構造

なし

7.4.3 finally節

try-catch-finallyの括弧の有無について注意書きが追加された。

※ catch節では、case文を必ず括弧で囲まなければならない。しかし、try節とfinally節では、式を1つだけ含む場合は括弧で囲む必要はない。 例えば、次のようにも記述できる。

try t() catch {
    case e: Exception => ...
} finally f()

第08章 関数とクロージャー

なし

第09章 制御の抽象化

なし

第10章 合成と継承

なし