ForNext
Only Do What Only You Can Do
Dean Wampler, Alex Payne『Programming Scala』
1章 イントロダクション ──時速 0マイルから 60マイルまで
- 1.1 なぜ Scalaを使うのか
- 1.1.1 もしあなたが Javaプログラマなら
- 1.1.2 もしあなたが Ruby、Pythonなどのプログラマなら
- 1.1.3 Scalaの紹介
- 1.1.4 Scalaの誘惑
- 1.2 Scalaのインストール
- 1.3 より詳細な情報
- 1.4 Scalaの味見
- 1.5 並行処理の味見
- 1.6 まとめ
2章 Scala言語の利点 ──少ないタイプで多くのことを
- 2.1 はじめに
- 2.2 セミコロン
- 2.3 変数宣言
- 2.4 メソッド宣言
- 2.4.1 メソッドのデフォルト引数と名前付き引数( Scala 2.8)
- 2.4.2 入れ子のメソッド定義
- 2.5 型情報の推論
- 2.6 リテラル
- 2.6.1 整数リテラル
- 2.6.2 浮動小数点リテラル
- 2.6.3 ブールリテラル
- 2.6.4 文字リテラル
- 2.6.5 文字列リテラル
- 2.6.6 シンボルリテラル
- 2.7 タプル
- 2.8 Option、Some、None:nullの回避
- 2.9 ファイルと名前空間によるコード構成
- 2.10 型やメンバのインポート
- 2.10.1 インポートは相対的
- 2.11 抽象型とパラメータ化された型
- 2.12 予約語
- 2.13 まとめ
3章 Scalaプログラミングの基礎 ──基本文法の総点検
- 3.1 演算子は演算子か
- 3.1.1 糖衣構文
- 3.2 丸括弧やドットのないメソッド
- 3.2.1 優先順位
- 3.3 ドメイン固有言語
- 3.4 Scalaのif文
- 3.5 Scalaのfor内包表記
- 3.5.1 犬でもわかる犬の例
- 3.5.2 フィルタリング
- 3.5.3 yield
- 3.5.4 スコープの拡大
- 3.6 その他のループ構文
- 3.6.1 Scalaのwhileループ
- 3.6.2 Scalaのdo-whileループ
- 3.6.3 ジェネレータ式
- 3.7 条件演算子
- 3.8 パターンマッチ
- 3.8.1 シンプルなマッチ
- 3.8.2 マッチ式の中の変数
- 3.8.3 型に対するマッチ
- 3.8.4 シーケンスに対するマッチ
- 3.8.5 タプル(およびガード)に対するマッチ
- 3.8.6 ケースクラスに対するマッチ
- 3.8.7 正規表現に対するマッチ
- 3.8.8 case節内における入れ子の変数の束縛
- 3.8.9 tr y-catch-finally節の使用
- 3.8.10 パターンマッチのまとめ
- 3.9 列挙
- 3.10 まとめ
4章 トレイト
- 4.1 トレイトの基礎
- 4.1.1 ミックスインとしてのトレイト
- 4.2 積み重ね可能なトレイト
- 4.3 トレイトの生成
- 4.3.1 クラスかトレイトか
- 4.4 まとめ
5章 Scalaによる初級オブジェクト指向プログラミング
- 5.1 クラスとオブジェクトの基礎
- 5.2 親クラス
- 5.3 コンストラクタ
- 5.3.1 親クラスのコンストラクタ呼び出し
- 5.4 入れ子のクラス
- 5.5 可視性のルール
- 5.5.1 公開可視性
- 5.5.2 限定公開可視性
- 5.5.3 非公開可視性
- 5.5.4 スコープ指定非公開可視性とスコープ指定限定公開可視性
- 5.5.5 可視性についての最終的な考察
- 5.6 まとめ
6章 Scalaによる上級オブジェクト指向プログラミング
- 6.1 クラスとトレイトのメンバをオーバーライドする
- 6.1.1 final宣言をオーバーライドしようとした場合
- 6.1.2 抽象/具象メソッドのオーバーライド
- 6.1.3 抽象/具象フィールドのオーバーライド
- 6.1.4 トレイトの抽象/具象フィールドのオーバーライド
- 6.1.5 クラス内の抽象/具象フィールドのオーバーライド
- 6.1.6 抽象型のオーバーライド
- 6.1.7 アクセサメソッドとフィールドの区別がないとき:統一形式アクセスの原則
- 6.2 コンパニオンオブジェクト
- 6.2.1 apply
- 6.2.2 unapply
- 6.2.3 コレクションのための applyとunapplySeq
- 6.2.4 コンパニオンオブジェクトと Javaの静的メソッド
- 6.3 ケースクラス
- 6.3.1 二項演算子用の糖衣構文
- 6.3.2 Sclala2.8における copyメソッド
- 6.3.3 ケースクラスの継承
- 6.4 オブジェクトの等価性
- 6.4.1 equalsメソッド
- 6.4.2 ==メソッドと !=メソッド
- 6.4.3 neメソッドと eqメソッド
- 6.4.4 Arrayの等価性と sameElementsメソッド
- 6.5 まとめ
7章 Scalaオブジェクトシステム
- 7.1 Predefオブジェクト
- 7.2 クラスとオブジェクト: staticはどこにあるか ?
- 7.2.1 パッケージオブジェクト
- 7.3 シールされたクラス階層
- 7.4 Scalaの型階層
- 7.5 オブジェクト階層の線形化
- 7.6 まとめ
8章 Scalaによる関数型プログラミング
- 8.1 関数型プログラミングとは何か?
- 8.1.1 数学における関数
- 8.1.2 変わらない変数
- 8.2 Scalaによる関数型プログラミング
- 8.2.1 関数リテラルとクロージャ
- 8.2.2 純粋さの内と外
- 8.3 再帰
- 8.4 末尾呼び出しと末尾呼び出しの最適化
- 8.4.1 末尾呼び出しのトランポリン
- 8.5 関数型データ構造
- 8.5.1 関数型プログラミングにおけるリスト
- 8.5.2 関数型プログラミングにおけるマップ
- 8.5.3 関数型プログラミングにおける集合
- 8.5.4 関数型プログラミングにおけるその他のデータ構造
- 8.6 走査、マッピング、フィルタリング、畳み込み、簡約
- 8.6.1 走査
- 8.6.2 マッピング
- 8.6.3 フィルタリング
- 8.6.4 畳み込みと簡約
- 8.6.5 関数型の Option
- 8.7 パターンマッチ
- 8.8 部分適用された関数と部分関数
- 8.9 カリー化
- 8.10 暗黙の型変換とパラメータ
- 8.10.1 暗黙の型変換
- 8.10.2 暗黙の関数パラメータ
- 8.10.3 暗黙の型変換とパラメータに関する最後の考察
- 8.11 名前渡し、値渡し
- 8.12 遅延評価値
- 8.13 まとめ
9章 アクターによる堅牢でスケーラブルな並行処理
- 9.1 状態に関する共有と同期の問題
- 9.2 アクターとは
- 9.2.1 概念としてのアクター
- 9.3 Scalaにおけるアクター
- 9.3.1 アクターへのメッセージ送信
- 9.3.2 メールボックス
- 9.3.3 アクターの詳細
- 9.3.4 アクターの実践的な使い方
- 9.4 Scalaにおける従来型の並行処理:スレッドとイベント
- 9.4.1 その場限りのスレッド
- 9.4.2 java.util.concurrentの利用
- 9.4.3 イベント
- 9.5 まとめ
10章 XMLとの連係
- 10.1 XMLを読む
- 10.1.1 XMLを探索する
- 10.1.2 XMLのループとマッチ
- 10.2 XMLを書く
- 10.2.1 現実世界の例
- 10.3 まとめ
11章 ドメイン固有言語
- 11.1 内部 DSL
- 11.1.1 給与計算の内部 DSL
- 11.1.2 中置演算子記法
- 11.1.3 暗黙の型変換とユーザー定義型
- 11.1.4 applyメソッド
- 11.1.5 給与計算ルール DSLの実装
- 11.1.6 内部 DSLのまとめ
- 11.2 外部 DSLとパーサコンビネータ
- 11.2.1 パーサコンビネータとは
- 11.2.2 給与計算の外部 DSL
- 11.2.3 外部 DSL文法の Scalaによる実装
- 11.2.4 外部 DSLによる給与小切手の生成
- 11.2.5 内部 DSL対外部 DSL
- 11.3 まとめ
12章 Scalaの型システム
- 12.1 型におけるリフレクション
- 12.2 パラメータ化された型を理解する
- 12.2.1 マニフェスト
- 12.2.2 パラメータ化されたメソッド
- 12.3 継承における変位指定
- 12.3.1 可変な型の変位指定
- 12.3.2 「Scalaの変位指定」対「 Javaの変位指定」
- 12.3.3 実装についての注意
- 12.4 型境界
- 12.4.1 上限型境界
- 12.4.2 下限型境界
- 12.4.3 Listに関する深い考察
- 12.4.4 ビューと可視境界
- 12.5 NothingとNull
- 12.6 抽象型を理解する
- 12.6.1 パラメータ化された型か抽象型か
- 12.7 パス依存型
- 12.7.1 C.this
- 12.7.2 C.super
- 12.7.3 path.x
- 12.8 値型
- 12.8.1 型指定子
- 12.8.2 タプル
- 12.8.3 パラメータ化された型
- 12.8.4 アノテーション付きの型
- 12.8.5 複合型
- 12.8.6 中置型
- 12.8.7 関数型
- 12.8.8 型射影
- 12.8.9 シングルトン型
- 12.9 自分型アノテーション
- 12.10 構造型
- 12.11 存在型
- 12.12 無限データ構造と遅延評価
- 12.13 まとめ
13章 アプリケーションの設計
- 13.1 アノテーション(注釈)
- 13.2 列挙対パターンマッチ
- 13.3 アノテーションと列挙についての考察
- 13.3.1 列挙対ケースクラスとパターンマッチ
- 13.4 null対Option
- 13.4.1 Optionとfor内包表記
- 13.5 例外とその代替手段
- 13.6 スケーラブルな抽象
- 13.6.1 細粒度の可視性ルール
- 13.6.2 ミックスイン合成
- 13.6.3 自分型アノテーションと抽象型メンバ
- 13.7 実践的なトレイトの設計
- 13.8 デザインパターン
- 13.8.1 Visitorパターン:より良い代替手段
- 13.8.2 Scalaにおける依存性の注入: Cakeパターン
- 13.9 契約による設計を使ったより良い設計
- 13.10 まとめ
14章 Scalaのツール、ライブラリ、IDEサポート
- 14.1 コマンドラインツール
- 14.1.1 scalacコマンドラインツール
- 14.1.2 scalaコマンドラインツール
- 14.1.3 scalap、javap、jadコマンドラインツール
- 14.1.4 scaladocコマンドラインツール
- 14.1.5 sbazコマンドラインツール
- 14.1.6 fscコマンドラインツール
- 14.2 ビルドツール
- 14.3 IDEとの統合
- 14.3.1 Eclipse
- 14.3.2 IntelliJ
- 14.3.3 NetBeans
- 14.3.4 テキストエディタ
- 14.4 Scalaでのテスト駆動開発
- 14.4.1 ScalaTest
- 14.4.2 Specs
- 14.4.3 ScalaCheck
- 14.5 その他の注目すべき Scalaのライブラリとツール
- 14.5.1 Lift
- 14.5.2 Scalaz
- 14.5.3 Scalax
- 14.5.4 MetaScala
- 14.5.5 JRebel(旧 JavaRebel)
- 14.5.6 その他雑多なライブラリ
- 14.6 Javaとの相互運用性
- 14.6.1 JavaとScalaのジェネリクス
- 14.6.2 Javaでの Scalaの関数の使用
- 14.6.3 JavaBeansプロパティ
- 14.6.4 AnyVal型と Javaのプリミティブ型
- 14.6.5 Javaコードでの Scalaの名前
- 14.7 Javaライブラリとの相互運用性
- 14.7.1 AspectJ
- 14.7.2 Spring Framework
- 14.7.3 Terracotta
- 14.7.4 Hadoop
- 14.8 まとめ
15章 SimpleBuildToolを使った Scalaの開発
- 15.1 Simple Build Tool
- 15.1.1 プロジェクト環境の構築
- 15.1.2 対話型シェル
- 15.2 プログラムの作成
- 15.2.1 プログラムの仕様
- 15.2.2 プロジェクト環境構築
- 15.2.3 依存ライブラリの設定とダウンロード
- 15.2.4 機能を分析する
- 15.2.5 一定期間で処理を実行するタイマー機能
- 15.2.6 XMLからデータを抽出する機能
- 15.2.7 HTTPによるフェッチ機能
- 15.2.8 全体をつなぐ
- 15.3 アプリケーションとして組み立てる
- 15.4 機能拡張
- 15.4.1 Entryの処理を拡張可能にする
- 15.4.2 動的にプラグインを変更する
- 15.5 まとめ
16章 Scala2.8の新機能と移行のポイント、日本語環境、サンプルコード
- 16.1 Scala 2.8の新機能
- 16.1.1 scala.collection.jclの廃止と scala.collection.JavaConversionsの導入
- 16.1.2 新しい配列の実装とポリモーフィックな配列に対するマニフェストの導入
- 16.1.3 型の特殊化
- 16.1.4 XMLの等価性の変更
- 16.1.5 アノテーションの改善
- 16.1.6 トランポリン
- 16.1.7 breakのサポート
- 16.2 バージョン 2.7から 2.8への移行ポイント
- 16.2.1 Predef.formatメソッドの実装変更
- 16.2.2 プリミティブ型の別名
- 16.2.3 パッケージ参照ルールの変更
- 16.2.4 else節省略時の if文の返り値の変更
- 16.2.5 Enumeration APIの変更
- 16.2.6 コレクション APIの戻り値の型の改善
- 16.2.7 RichStringの廃止
- 16.2.8 抽象ケースクラスの継承
- 16.2.9 XMLの等価性の変更
- 16.2.10 アノテーション
- 16.2.11 ライブラリ
- 16.3 Scalaの日本語環境
- 16.3.1 ソースコードエンコーディング
- 16.3.2 Scala対話環境
- 16.3.3 ファイルの日本語の入出力
- 16.4 サンプルコード