メタプログラミングRuby』を読みました。面白かったのでご紹介します。第1部だけ少し細かく書いてあります。から騒ぎ本のタイトルは『メタプログラミングRuby』ですが、メタプログラミングに限らずRubyでスムーズにプログラミングするために必要な知識がどっさり載っています。複数のクラスに同じクラスメソッドを定義するにはどういう方法があるか?クラスインスタンス変数とは何か?クラス変数との違いは?など、曖昧に覚えていることや使うたびに調べているようなことが、整理されて論理的に理解できるようになりました。Rubyのコードを論理的に読み解くには、オブジェクトモデルとスコープの理解が欠かせません。Rubyのオブジェクトモデルには"メタクラス"あるいは"特異クラス"と呼ばれる隠れたクラスが潜んでおり、重要な役割を果たしています。あるクラスAのインスタンスaを作り、その特異クラスにメソッドを定義すると特異メソッドになります。"foo"しかしaのクラスであるAにはfooメソッドがありませんし、Aのスーパークラスにも特異クラスは現れません。BasicObject]では特異クラスはどこにあるのでしょうか?次にスコープの例です。@@a答えは"受ける"です。上のコードの結果は2になります。インスタンス変数@aや、ローカル変数aだったらどうでしょうか?またそれはなぜでしょうか?以上のような質問に答えるために、それぞれの場合の答えを丸暗記する必要はありません。単純なスコープのルールを覚えておけば済みます。スコープを理解すると、class_evalやinstance_evalの使いどころや、クロージャの意味まで明確になります。『メタプログラミングRuby』にはそれらを理解するための例や解説が豊富に載っています。物語形式になっていて、リラックスして読み進めることができると思います。『メタプログラミングRuby』を読んだ一番の成果は、上述のオブジェクトモデルとスコープの理解が深まったことでした。これだけでプログラミングが楽になったと実感したほどです。lambdaの違いなど、オフトピックも面白かったことです。以上、購入を考えている方の参考になれば幸いです。3ではroutesのDSLが完全に刷新されました。あの見難かったハッシュの塊が解かれて、:memberや:getなど予約語の役割をしていたシンボルはディレクティブになりました。3ではディレクティブになり、ユーザの与える値がシンボルとして残りました。ActionController::Routing::RouteSet::Mapperインスタンスであるmapが必要なくなっています。3のroutesについてまとめます。'users#show'になります。mapが不要になったことと、コントローラとアクションを1つの値で指定できることで簡潔になっていますね。逆に、オプションのパラメータは()で囲む必要があります。デフォルトルートは下のように定義されます。3では基本のmatchディレクティブに:asを付けます。3ではrootというディレクティブを使います。基本のmatchディレクティブでは、実は:toを省略できます。下の2つは同じことです。'users#show'さらに、パスのノード名がコントローラ名とアクションに一致するなら、それも省略可能です。よって下の2つは同じです。3でもresourcesとして使用可能です。:shopsresourcesはブロックを受け取り、その中で冒頭で紹介したmemberやgetといったディレクティブを使用できます。2と同様、has_manyの関係を定義できます。namespacenamespaceディレクティブを使うことで、パス(URL)とコントローラを任意の名前空間に入れることができます。下のように書くことで、パスは/admin/users、コントローラはapp/controllers/admin/users_controller.rbに置かれたAdmin::UsersControllerになります。3ではルーティングの機構自体がRackミドルウェアなので、別のRackアプリケーションを呼び出すようなルートも書けるようになりました。:toの先にSinatra::Baseの子クラスを書くことができます。3の特集を書かれました。commentsGitの新機能を使ってHerokuへのpushを軽くするHerokuはRack専用のホスティングサービスで、Gitでpushすることでデプロイできるという特長があります。pushはブランチのヒストリを全て転送するため、実際のデプロイメントに必要ない過去のファイルも転送されてしまい、無駄です(バックアップとして使えるという考え方もあると思いますが、その目的であれば他にもっと効率的な方法があります)。1.7.2の新しい機能を使って、実際のデプロイメントに必要なファイルだけをpushする方法を説明します。1.7.2では、checkoutコマンドに--orphanというオプションが追加されました。commit.つまり、--orphanを付けて新しいブランチを作ることで、ヒストリから切り離されたコミットを作ることができます。fileとしてステージされた状態になります。README#ここでcommitすればdeployブランチ唯一のコミットができます。READMEshow-branchすることで、既存のブランチから完全に切り離されていることが分かります。deploy:master転送するオブジェクトは最小で済むはずです。