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の登録が始まり次第飛び込みます!