メタプロは魔術だ /「Metaprogramming Ruby 2 - Part 1. Metaprogramming Ruby」を読んだ

4月から Metaprogramming Ruby 2 を読んでて,やっと Part 1. Metaprogramming Ruby まで読み終えたので簡単にまとめる.引き続き Part 2. Metaprogramming in Rails を読む.

ここまで読んで,今まで「何となく Ruby を書いてた」自分に気付くことができたし,Rails や Gem のコードを見ても今まで以上に「読める感」を感じられるので非常に良かった.

Metaprogramming Ruby 2: Program Like the Ruby Pros (Facets of Ruby)

Metaprogramming Ruby 2: Program Like the Ruby Pros (Facets of Ruby)

なぜ洋書?

メタプロ本は既に日本語に翻訳されていて有名だけど,これは Ruby 1.9 系をベースに書かれた Metaprogramming Ruby の翻訳本で,洋書だと Ruby 2 系をベースに追記された Metaprogramming Ruby 2 が最新版になってる.内容的に少しの差ではあるけど,今後も主に使うのは Ruby 2 系だってことで Metaprogramming Ruby 2 を買った.

洋書を読むことで英語も学びたいという気持ちもあるけど,読むスピードが圧倒的に下がったのは言うまでもなく,実力不足を痛感した.

Metaprogramming Ruby: Program Like the Ruby Pros (Facets of Ruby)

Metaprogramming Ruby: Program Like the Ruby Pros (Facets of Ruby)

メタプログラミングRuby

メタプログラミングRuby

(追記)

とうとう第2版の翻訳本が発表された!

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

学べたこと

まさに Ruby のメタプロと言えるポイントを学べた.まだ「何となくわかってる」レベルのところもあるから,継続的にコード書いたり,読み返したり,誰かに説明したりして理解を深めていく.

  • Open Class
  • Monkeypatch
  • Refinement
  • Dynamic Method
  • Ghost Method
  • Scope
    • Scope Gate
    • Flat Scope
  • Callable Object
    • Proc
    • lambda
  • Aliases
  • Binding

Ruby 2 系で追加されてるところ

例えば Refinement の解説が追加されてたりする.オープンクラスで拡張するとその影響がグローバルに変わってしまうから Ruby 2 なら refine で影響を狭めることができる.

module MyRefinement
  refine String do
    def reverse
      'my reverse'
    end
  end
end

p 'abc'.class
p 'abc'.reverse

using MyRefinement

p 'abc'.class
p 'abc'.reverse
# >> String
# >> "cba"
# >> String
# >> "my reverse"

Ruby Gold を目指す

5月末に Ruby Association Certified Ruby Programmer Gold version 2.1 を申し込んだ.Ruby Gold はメタプロの問題が多く出るのでしっかり理解して自信持てるように.

関連エントリー