コップ本第3版
- コップ本第3版と第2版の差分をメモっとく。第11~20章 (24 Oct 2016 | Tags:
コップ本第3版と第2版の差分をメモっとく。第11~20章 コップ本第3版と第2版の差分をメモっとく。第11~20章
9/20に出版されたScalaスケーラブルプログラミング第3版を手元の第2版と読み比べして、差分をメモってく。
第11章 Scalaの階層構造
11.1 Scalaのクラス階層
[Old] Scalaのクラスは、ScalaObjectという特別なマーカーとなるトレイトも継承しているという点でJavaのクラスと異なる。
[New] scala.ScalaObjectがなくなった。(2.10からなくなってた)
11.4 独自の値クラスの定義
節が追加された。
値クラスにできるクラスの条件
- パタメータがちょうど1つ
- 内容はdefだけ
- 他のクラスは値クラスを拡張できない
- 値クラスは、
equals
やhashCode
を再定義できない
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 情報が豊富なエラーレポート
expect
がassertResult
に。intercept
がassertThrow
に。例外の内容をもっと詳しく知りたいときには、
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節のローンパターンのサンプルを一般化する場合についての説明以降が省略された。
LinkLatest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books:
- コップ本第3版と第2版の差分をメモっとく。第1~10章 (24 Sep 2016 | Tags:
コップ本第3版と第2版の差分をメモっとく。第1~10章 コップ本第3版と第2版の差分をメモっとく。第1~10章
9/20にScalaスケーラブルプログラミングの第3版が出版されて、しかも第3版から電子書籍にも対応したので、早速入手した。
せっかくなんで、手元の第2版と読み比べして、差分をメモってく。
第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
この場合、
salt
がtrue
なら、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章 合成と継承
なし
Latest post:
- OpenWhiskのScala sbtプロジェクトのgiter8テンプレートを作った
- OpenWhisk+Scalaで作るServerless Architectureとっかかり
- BluemixにPlayframeworkアプリケーションをデプロイする
- sbt、Giter8を統合するってよ
- Scala 2.12.0でSAM型
Recent Books: