Rails のソースコードを読む

2008/05/02

私は Rails のソースコードを読むのが大好きです。

複雑怪奇で読み解けないことも多いのですが、時折、簡潔で美しいコードに出会ってちょっとした感動を覚えます。

もし、あなたがまだ読んだことがないのであれば、ActiveSupport の extract_options.rbattribute_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#flattenObject#is_a?Module#class_eval など、いかにも Rubyist 好みのメソッドたちが適切な文脈で活躍しているのをご覧になれば、きっと楽しくなることでしょう。

--
黒田努