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

Hamamatsu.rb#3

月1で行われています。
http://atnd.org/events/15185


ブログに書いたつもりで、頭からすっぽり抜けていました…
5/11に参加してきました!


今回は、前回残っていた1章の1.5〜2章終わりまで進みました。
前回の最後に決めたとおり、予習必須で事前に疑問点を上げておき、それを議論するやり方で進みました。


本の内容としては、メソッドが呼び出されたときに、メソッド探索がどのように行われるのかという内容や
プログラムの重複を無くすために、メソッドを動的に呼び出してみたり…
method_missingを使って、存在しないメソッドが呼ばれたときに、そのメソッドをこっそり作成していたり…

  • 動的メソッド
  • 動的ディスパッチ
  • 動的プロキシ
  • ブランクスレート

などの単語が出てきました。
まだ頭の中がごちゃごちゃなので、徐々にやり方を覚えていきたいと思います( ´ー`)


今回特に「なるほどー」と思ったのは、複数includeしたときに、どういう順番になるかという所です。
メソッド探索の部分の話になります。
bookというインスタンスがあった場合、まずBookクラスのメソッドが探索され、無ければincludeされたものの中から探し、さらに無ければ上位のクラスを探し…
という継承チェーンをたどります。

本に載っている図を再現すると大体下の様になります

__________
 Basic Object   
                                  • -
    ↑ __________
   Kernel   
                                  • -
    ↑ __________
   Object   
                                  • -
    ↑ __________
   Book       自分で作成したクラス  ← bookインスタンス
                                  • -

もし、Bookにinclude Aした場合、

__________
 Basic Object   
                                  • -
    ↑ __________
   Kernel   
                                  • -
    ↑ __________
   Object   
                                  • -
    ↑ __________
    A     
                                  • -
    ↑ __________
   Book       自分で作成したクラス  ← bookインスタンス
                                  • -


こうなります。

ここでもし、
include A
include B
をすると…

__________
 Basic Object   
                                  • -
    ↑ __________
   Kernel   
                                  • -
    ↑ __________
   Object   
                                  • -
    ↑ __________
    A     
                                  • -
    ↑ __________
    B     
                                  • -
    ↑ __________
   Book       自分で作成したクラス  ← bookインスタンス
                                  • -

となるらしいです。
てっきり、includeした順に、どんどん上に乗っていくと思っていました…が、実際は最初にAがincludeされて、Bが押し上げる形になるそうです。


なぜこれに気をつける必要があるかというと、同じ名前のメソッドを持っていた場合。
メソッド探索は上の図で言うと、Bookクラス→B→A→Object→Kernel→Basic Objectの順番で行われます。
メソッド探索をして、最初に見つかったメソッドが実行されます。
もし、Aのprintメソッドを呼びだそうとしていると、Bのメソッドが実行されてしまいます。
上のままでは先にBのprintメソッドが先に見つかってしまうからです。

こんな時は、include文の宣言順番を入れ替えればいいと書いてありました。
なるほどなるほど…



大体こんな感じです。
上の図など、本のほうがもう少しわかりやすい気もしますが…


間違っている部分等あれば、こっそり教えていただけるとありがたいです…


次回は3章!
atndの登録が始まり次第飛び込みます!