Web備忘録

雑多に書いています

「メタプログラミングRuby」を読んだ感想

メタプログラミングRuby」を読みました。

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

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

物語形式で進む技術書で、主な登場人物は二人。ボブとビルです。

ボブは新入社員で、Rubyを触り始めて数週間(の割にはすごい理解力ある)。その上司である「経験豊かなビル」が、実務上の課題を解決する上でのメタプログラミングの使用法をボブに教える、という形式で進んでいきます。

メタプログラミングというタイトルが「なんかやばそう」なオーラを出してますが、内容としては思っていたよりは理解が追いついてちゃんと読めて、凄く面白かったです。

いままで、「Ruby超入門」、「たのしいRuby 5版」、「プロを目指す人のRuby入門」とやってきて、4冊目としてとてもいいレベル感のものに手を出せたなーと思ってます。我ながら素晴らしい

理解が難しい所もありましたが、Rubyについて実践的な知識が得られる本じゃないですかね?(といっても本当に実践的かどうかはまだ実務してないのでわからないですが)

学んだこと(覚えてる範囲で)

  • クラスとモジュールの継承関係
  • 動的メソッド・ゴーストメソッド
  • クロージャ(ブロック)を利用した動的処理の受け渡し
  • スコープとself
  • 特異クラス
  • フックメソッド
  • ActiveRecord::Baseの構成要素

印象に残った概念とかコードとか

うーむ、10日ぐらい前に読んだので、すぐにぱぱっと思い出せない。 プログラミングあるあるだと思うんだけど、挙動ベースで覚えるから、こう、言葉にできない。言葉にする力、ダイジダネ。

下の概念は、この本で学んだ、個人でRuby書いてく上でも瞬間的に役に立ってるって思ってる部分です。

  • メソッドの探索経路
  • Object#method_missingをオーバーライド
  • スコープとself

メソッドの探索経路

これでRubyのメソッド探索の理解度がぐんと上がりました。

(自分でまとめた図。字が汚いのは原著リスペクトです。本気で書いてこんなもんってわけじゃないよ!!(大声))

f:id:fujiten3:20190323144243j:plain

改めて読むと読み解き辛くて笑える。 過去の自分の呟きに読み方が書いてました。

お、おう。

うん、つまりたぶんこういうことだと思う。まずあるクラスがあるとする。そして、そのクラスのスコープ範囲内で定義されたメソッドは、そのクラスに生成されたインスタンス達がそのメソッドが持ってるかのような挙動(インスタンスメソッド的)であるが、この探索経路を踏まえて考えると、あくまでもそのメソッドを持っているのは定義されたクラスで、インスタンスは「メソッドの探索経路の中で、親クラスで定義されているメソッドを捕まえるだけである」と考えてもいいということだ。

……まあ、このへんは実際に本買ったほうがわかりやすいですわ…。

Object#method_missingをオーバーライドする

Object#method_missingは例外NomethodErrorを返すメソッドです。 そいつをオーバーライドすることでそのクラスのインスタンス達はあらゆるメソッドに反応できる力を得ます。

class Dog 

  def method_missing(method, *args)
    puts "呼び出したメソッド: #{method}(#{args.join(',')}) "
    puts "(ブロックも渡したね)" if block_given?
  end

end
dog = Dog.new
dog.wow!
=> 呼び出したメソッド : wow!()
dog.wowow!{ "BowWow!!" }
=> 呼び出したメソッド : wowow!()
(ブロックも渡したね)

これでNomethodErrorからおさらば! このような「コード上に存在しないメソッド」のことをゴーストメソッドというそうです。 今回の場合だと、Dog#wow!や、Dog#wowow!がゴーストメソッド。

(ただし危険性も高いので、出来る限り「動的メソッド」で対応した方が望ましいとのことです。詳しくは原著へ。)

深い

結論から言うと、Ruby、ありえん深みがある。(というかどのプログラミング言語も深みがありそう)

また追記するかもしれないですが、今日のところは以上です。

Ruby、もうちょっと深く知りたいな」って方はぜひ読んでみて下さい!

おわり。