9/20に出版されたScalaスケーラブルプログラミング第3版を手元の第2版と読み比べして、差分をメモってく。

第1章〜第10章はこっち


第11章 Scalaの階層構造

11.1 Scalaのクラス階層

[Old] Scalaのクラスは、ScalaObjectという特別なマーカーとなるトレイトも継承しているという点でJavaのクラスと異なる。

[New] scala.ScalaObjectがなくなった。(2.10からなくなってた)

11.4 独自の値クラスの定義

節が追加された。

値クラスにできるクラスの条件

  • パタメータがちょうど1つ
  • 内容はdefだけ
  • 他のクラスは値クラスを拡張できない
  • 値クラスは、equalshashCodeを再定義できない
class Dollars(val amount: Int) extends AnyVal {
	override def toString() = "$" + amount
}

> val money = new Dollars(1000)
money: Dollars = $1000

第12章 トレイト

なし

第13章

なし

第14章 アサーションとテスト

14.1 アサーション

アサーションをコンパイル時に有効・無効化する方法が変わった。

  • 第2版 : JVMの-ea-daオプション
  • 第3版 : scalacコマンドに-Xdisable-assertionsオプションを指定して無効化

ScalaTestの使い方についての説明が更新された。

14.3 情報が豊富なエラーレポート

expectassertResultに。

interceptassertThrowに。

例外の内容をもっと詳しく知りたいときには、assertThrowsではなくinterceptを使う。

(第2版)14.4 JUnitとTestNGの使い方

無くなった

14.4 仕様としてのテスト

ScalaTestの説明がバージョンアップに追随。 specsの説明がspecs2に。

14.5 プロパティベーステスト

ScalaCheckの説明がバージョンに追随。

第15章 ケースクラスとパターンマッチ

15.1.3 matchとswitchの違い

match式は、 式の評価時に例外が投じられなければ、 必ず値を返す。

15.2.7.1 型消去(type erasure)

scalaインタープリターの-uncheckedオプションの説明が無くなった。

15.2.8 変数の束縛

expr match {
	case UnOp("abs", e @ UnOp("abs", _)) => e
}

変数束縛パターン(variable-binding pattern)で、値を束縛した場合、eとexprは同じ値を持つが、絶対値演算は1つ少なくなる。

という捕捉が追加された。

第16章 リストの操作

16.6.2 分割統治原則

???についての注釈が追加された。

第17章 コレクションの使い方

なし

第18章 ミュータブルオブジェクト

章名が、ステートフルオブジェクト => ミュータブルオブジェクトに変更。

第19章 型のパラメーター化

なし

第20章 抽象メンバー

20.8 リファインメント型

節名が、構造的サブ型 から リファインメント型 に変更された。

9.4節のローンパターンのサンプルを一般化する場合についての説明以降が省略された。