- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2010/08/28
- メディア: 大型本
- 購入: 18人 クリック: 533回
- この商品を含むブログ (124件) を見る
全体的には,メタプログラミングとは何をすることなのかということと,メタプログラミングするために必要となる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で書かれたライブラリなどのソースコードを読む手助けになると思う.