Rails のソースコードを読む
2008/05/02
私は 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 好みのメソッドたちが適切な文脈で活躍しているのをご覧になれば、きっと楽しくなることでしょう。
--
黒田努