読者です 読者をやめる 読者になる 読者になる

メタプログラミングRuby読んだ

メタプログラミングRuby

メタプログラミングRuby

全体的には,メタプログラミングとは何をすることなのかということと,メタプログラミングするために必要となるRubyのオブジェクトモデル(『「このメソッドはどのクラスのものなのか?」や「このモジュールをインクルードしたら何が起きるのか?」といった質問の答えるが見つかる場所』)やその周辺について,2人の会話形式で進めていくような形で書かれている.メタプログラミングをするので,Rubyの表面的なことではなく,内部的なことから理解できてすごくいい.メタプログラミングに興味がなくても割りと楽しめると思う.

Rubyに一歩踏み込んだクラスやメソッド,スコープなどの説明がされていて,なんとなく理解していたことの理解がすすんだ.クラスメソッドの説明まで少し引用すると

class MyClass
  puts 'Hello!'
end

例えば,これを実行すると

Hello!

となり,クラス定義も最後の命令文を返す.

result = class MyClass
  self
end

つまり,これは

result # => MyClass

こうなる.つまりクラス定義では,クラスがカレントオブジェクトselfの役割を担っていて,selfになれるということがわかる. 次に,特異メソッドというものがある.これは,「あるオブジェクトに特化したメソッドのこと」をいう.

例えば,こんな感じ.

str = "just a regular string"

def str.title?
  self.upcase == self
end
str.title?                   # => false
str.methods.grep(/title?/)   # => ["title?"]
str.singleton_methods        # => ["title?"]

上記のコードはtitle?()メソッドを文字列strに追加していて,Stringクラスの他のオブジェクトには影響がでない.

そして,クラスメソッドの真実が解説される.

def obj.a_singleton_method; end
def MyClass.another_class_method; end

これをクラス定義に書くと,クラスがselfになるので

class MyClass
  def self.yet_another_class_method; end
end

こう書ける.だからクラスメソッドをこう書くことがわかる.

今まで入門書とかでなんとなく理解していたものが,ちゃんとなぜなのかということがわかるのはすごく感動する.

記事書いていてメタプログラミングの話してないことに気がついたんだけど,こういう感じでRubyのオブジェクトモデルについての解説のあと,メタプログラミングのさらにおもしろい話に展開していく.

他にも実際に使われているメタプログラミングの例を解説してくれたり,メタプログラミングのイディオムが最後の付録まとめられていたりしているのが良かった.今まで人のRubyソースコードを読んでみようと思っても,理解できなかった部分があったのだけど,そこがメタプログラミングのイディオムであったりして,かなり理解がすすんだように思う.Rubyで書かれたライブラリなどのソースコードを読む手助けになると思う.

Twitterのほうもよろしくお願いします.スワロイド (tsuwatch) on Twitter