内容紹介
『メタプログラミングRuby』の改定版!
本書改訂版はRuby 2.xとRuby 1.9、Rails4に対応したことが最大のポイント。言語のアップデートに伴い文法も変わっています。さらにJRubyに対応しています。
目次
詳細目次
読者の声
序文
はじめに
Ⅰ部 メタプログラミングRuby
1章 頭文字M
1.1 ゴーストタウンと市場
1.2 メタプログラマのボブの物語
1.2.1 ボブの最初の試み
1.2.2 メタプログラミングに突入
1.2.3 頭文字Mセカンドステージ
1.3 メタプログラミングとRuby
2章 月曜日:オブジェクトモデル
2.1 オープンクラス
2.1.1 クラス定義の内部
2.1.2 Monetizeの例
2.1.3 オープンクラスの問題点
2.2 オブジェクトモデルの内部
2.2.1 オブジェクトの中身
2.2.2 クラスの真相
2.2.3 定数
2.2.4 オブジェクトとクラスのまとめ
2.2.5 ネームスペースを使う
2.3 クイズ:引かれていない線
2.3.1 クイズの答え
2.4 メソッドを呼び出すときに何が起きているの?
2.4.1 メソッド探索
2.4.2 メソッドの実行
2.4.3 Refinements
2.5 クイズ:絡み合ったモジュール
2.5.1 クイズの答え
2.6 まとめ
3章 火曜日:メソッド
3.1 重複問題
3.1.1 レガシーシステム
3.1.2 ダブル、トリプル、そしてトラブル
3.2 動的メソッド
3.2.1 メソッドを動的に呼び出す
3.2.2 Pryの例
3.2.3 メソッドを動的に定義する
3.2.4 Computerクラスのリファクタリング
3.3 method_missing
3.3.1 method_missingのオーバーライド
3.3.2 ゴーストメソッド
3.3.3 動的プロキシ
3.3.4 Computerクラスのリファクタリング(再び)
3.4 クイズ:バグ退治
3.4.1 クイズの答え
3.5 ブランクスレート
3.5.1 BasicObject
3.5.2 メソッドの削除
3.5.3 Computerクラスの修正
3.6 まとめ
3.6.1 「動的メソッド」対「ゴーストメソッド」
4章 水曜日:ブロック
4.1 ブロックの日
4.1.1 今日の指針
4.1.2 ブロックの基本
4.2 クイズ:Ruby#
4.2.1 usingキーワード
4.2.2 挑戦
4.2.3 クイズの答え
4.3 ブロックはクロージャ
4.3.1 スコープ
4.3.2 スコープゲート
4.3.3 スコープのフラット化
4.3.4 クロージャのまとめ
4.4 instance_eval
4.4.1 カプセル化の破壊
4.4.2 クリーンルーム
4.5 呼び出し可能オブジェクト
4.5.1 Procオブジェクト
4.5.2 「Proc」対「lambda」
4.5.3 Methodオブジェクト
4.5.4 呼び出し可能オブジェクトのまとめ
4.6 ドメイン特化言語を書く
4.6.1 はじめてのDSL
4.7 クイズ:より良いDSL
4.7.1 ビルの逃亡
4.7.2 クイズの答え
4.8 まとめ
5章 木曜日:クラス定義
5.1 クラス定義のわかりやすい説明
5.1.1 クラス定義の中身
5.1.2 カレントクラス
5.1.3 クラスインスタンス変数
5.1.4 Bookwormの作業再び
5.2 クイズ:クラスのタブー
5.2.1 クイズの答え
5.3 特異メソッド
5.3.1 特異メソッドの導入
5.3.2 クラスメソッドの真実
5.3.3 クラスマクロ
5.4 特異クラス
5.4.1 特異メソッドの謎
5.4.2 特異クラスの出現
5.4.3 メソッド探索再び
5.4.4 特異クラスと継承
5.5 クイズ:モジュールの不具合
5.5.1 クイズの答え
5.6 メソッドラッパー
5.6.1 アラウンドエイリアス
5.6.2 さらにメソッドラッパー
5.6.3 Amazonの問題の解決
5.7 クイズ:壊れた計算
5.7.1 クイズの答え
5.8 まとめ
6章 金曜日:コードを記述するコード
6.1 週末を迎えるためのコーディング
6.1.1 上司の依頼
6.1.2 開発計画
6.2 Kernel#eval
6.2.1 REST Clientの例
6.2.2 Bindingオブジェクト
6.2.3 irbの例
6.2.4 「コード文字列」対「ブロック」
6.2.5 evalの問題点
6.3 クイズ:アトリビュートのチェック(手順1)
6.3.1 このクイズに答える前に
6.3.2 クイズの答え
6.4 クイズ:アトリビュートのチェック(手順2)
6.4.1 クイズの答え
6.5 クイズ:アトリビュートのチェック(手順3)
6.5.1 クイズの答え
6.6 クイズ:アトリビュートのチェック(手順4)
6.6.1 クイズの答え
6.7 フックメソッド
6.7.1 その他のフック
6.7.2 VCRの例
6.8 クイズ:アトリビュートのチェック(手順5)
6.8.1 クイズの答え
6.9 まとめ
7章 エピローグ
Ⅱ部 Railsにおけるメタプログラミング
8章 Railsツアーの準備
8.1 Ruby on Rails
8.2 Railsのインストール
8.3 Railsのソースコード
9章 Active Recordの設計
9.1 Active Recordの短いサンプル
9.2 Active Recordはどのようにまとめられているか
9.2.1 オートローディングの仕組み
9.2.2 ActiveRecord::Base
9.2.3 Validationsモジュール
9.3 学習したこと
10章 Active SupportのConcernモジュール
10.1 Concern以前のRails
10.1.1 includeとextendのトリック
10.1.2 includeの連鎖の問題
10.2 ActiveSupport::Concern
10.2.1 Concernのソースコードの概観
10.2.2 Concernのまとめ
10.3 学習したこと
11章 alias_method_chainの盛衰
11.1 alias_method_chainの登場
11.1.1 alias_method_chainを使う理由
11.1.2 alias_method_chainの中身
11.1.3 Validationsの見納め
11.2 alias_method_chainの衰退
11.2.1 Module#prependの誕生
11.3 学習したこと
12章 アトリビュートメソッドの進化
12.1 実践アトリビュートメソッド
12.2 複雑さの歴史
12.2.1 Rails 1:はじめはシンプル
12.2.2 Rails 2:パフォーマンスに注目
12.2.3 Rails 3と4:もっと特殊なケース
12.3 学習したこと
13章 最後の教訓
13.1 メタプログラミングはただのプログラミング
付録A よくあるイディオム
A.1 ミミックメソッド
A.1.1 Campingの例
A.2 nilガード
A.2.1 nilガードとブール値
A.3 自己yield
A.3.1 Faradayの例
A.3.2 tapの例
A.4 Symbol#to_proc
付録B ドメイン特化言語
B.1 ドメイン特化言語の例
B.1.1 DSLを使う
B.2 内部DSLと外部DSL
B.3 DSLとメタプログラミング
付録C 魔術書
C.1 魔術
C.1.1 アラウンドエイリアス(Around Alias)
C.1.2 ブランクスレート(Blank Slate)
C.1.3 クラス拡張(Class Extension)
C.1.4 クラスインスタンス変数(Class Instance Variable)
C.1.5 クラスマクロ(Class Macro)
C.1.6 クリーンルーム(Clean Room)
C.1.7 コードプロセッサ(Code Processor)
C.1.8 コンテキスト探査機(Context Probe)
C.1.9 あとで評価(Deferred Evaluation)
C.1.10 動的ディスパッチ(Dynamic Dispatch)
C.1.11 動的メソッド(Dynamic Method)
C.1.12 動的プロキシ(Dynamic Proxy)
C.1.13 フラットスコープ(Flat Scope)
C.1.14 ゴーストメソッド(Ghost Method)
C.1.15 フックメソッド(Hook Method)
C.1.16 カーネルメソッド(Kernel Method)
C.1.17 遅延インスタンス変数(Lazy Instance Variable)
C.1.18 ミミックメソッド(Mimic Method)
C.1.19 モンキーパッチ(Monkeypatch)
C.1.20 ネームスペース(Namespace)
C.1.21 nilガード(Nil Guard)
C.1.22 オブジェクト拡張(Object Extension)
C.1.23 オープンクラス(Open Class)
C.1.24 Prependラッパー(Prepended Wrapper)
C.1.25 Refinements(Refinements)
C.1.26 Refinementsラッパー(Refinements Wrapper)
C.1.27 サンドボックス(Sandbox)
C.1.28 スコープゲート(Scope Gate)
C.1.29 自己yield(Self Yield)
C.1.30 共有スコープ(Shared Scope)
C.1.31 特異メソッド(Singleton Method)
C.1.32 コード文字列(String of Code)
C.1.33 SymbolのProc変換(Symbol To Proc)
付録D から騒ぎ
D.1 Nullオブジェクト
D.2 Rubyの強みを活かす
D.3 Nullオブジェクトの向こう側
訳者あとがき
続きを見る