Rails のソースコードを読む
私は Rails のソースコードを読むのが大好きです。
複雑怪奇で読み解けないことも多いのですが、時折、簡潔で美しいコードに出会ってちょっとした感動を覚えます。
もし、あなたがまだ読んだことがないのであれば、ActiveSupport の extract_options.rb とattribute_accessors.rb をお勧めします。
ソースコードのある場所は環境によって異なりますが、Windows なら Ruby をインストールしたフォルダから、Linux なら /usr/lib/ruby/ ディレクトリから gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext へと降りていき、その下の array および class フォルダ(ディレクトリ)にあります。(2.0.2 の部分は適宜読み替えてください)
extract_options.rb には(コメントを除去すると)、要するに次のように書いてあります:
module ActiveSupport
module CoreExtensions
module Array
module ExtractOptions
def extract_options!
last.is_a?(::Hash) ? pop : {}
end
end
end
end
end
で、このファイルは1階層上にある array.rb で require され、Array クラスに extract_options! メソッドが追加されることになります。
メソッドの中身はたったの一行です:
last.is_a?(::Hash) ? pop : {}
配列の最後の要素がハッシュであれば配列からそれを取り除いて、そのハッシュを返します。ハッシュでなければ空のハッシュを作って返します。配列の中身が変わってしまうかもしれないので、Ruby の慣習に従ってメソッド名に ! が付いています。
どうですか? 俳句のようではないですか?
Rails のメソッドの中には、最後にオプション引数としてハッシュを取るものが多くあります。例えば、ActiveRecord::Base#find などですが、この種のメソッドではたいてい extract_options! メソッドでオプション引数を取り出しています。
もう一つのお勧め attribute_accessors.rb のコードは 50 行足らずです。Rails のソースコードでよく現れる、謎の cattr_accessor メソッドがここで定義されています。
長くなるのでソースコードは掲載しません。是非、テキストエディタで開いて眺めてみてください。Array#flatten、 Object#is_a?、Module#class_eval など、いかにも Rubyist 好みのメソッドたちが適切な文脈で活躍しているのをご覧になれば、きっと楽しくなることでしょう。
--
黒田努
(2008/05/02)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- Rails はエンタープライズの世界で主流になるか (2008/03/29)
- Rails 2.0 ベンチマーク (2008/03/30)
- テスト駆動開発とデバッグコード (2008/04/07)
- Git or Mercurial (2008/04/22)
- RESTful Ruby on Rails -- その美しさと難しさ (2008/04/23)
- RESTful Ruby on Rails -- 単数と複数 (2008/04/24)
- Rails のソースコードを読む (2008/05/02)
- sudo: no passwd entry for app! (Capistrano 2.3.0) (2008/05/12)
- Rails on GlassFish (2008/06/18)
- 「Ruby は型宣言がないけど、ちゃんとしたシステムに使えるのか」という質問にどう答えるか (2008/11/23)
- 「Ruby はスクリプト言語だけど、遅くないですか」という質問にどう答えるか (2008/11/24)
- どのプログラミング言語が将来的に有望か (2009/01/10)
- どのフレームワークが将来的に有望か (2009/01/11)
- フレームワーク対 CMS (2009/01/12)
- Rails 2.3 で spawner/reaper は DEPRECATED に (2009/03/25)
- db/seeds.rb (2009/06/08)
- LESSとSass (2009/08/03)
- Rails 2.3.4 と I18n (2009/08/15)
- RubyGems のアップデート(上書きインストール) (2010/02/03)
- クリエイティブ・コモンズの Rails 教材 (2010/03/08)
- Yet Another Ruby Reference (2010/03/12)
- Rails で MongoDB を使ってみた (2010/03/23)
- Rails で MongoDB を使ってみた(2) (2010/03/25)
- 祝 Ruby on Rails 3.0 beta2 リリース (2010/04/02)
- Rails 3.x 時代のテストフレームワーク (2010/04/24)
- 続・Rails 3.x 時代のテストフレームワーク (2010/05/06)
- Test::Unit と RSpec と Shoulda (2010/05/06)
- Windows + Rails + MySQL 5.1 (2010/07/20)

