「初めてのRuby」を読むの続き
8章 オブジェクトとクラス
8.6 メソッドの探索
から
■8.6 メソッドの探索
・オブジェクトがメッセージを受け取ったとき、
呼び出されるメソッドはどのように決定されるか
→基本的にはオブジェクトの属するクラスによって決定
(1)最初の候補は特異メソッド
(2)次に属するクラスのインスタンスメソッド
(3)includeしたモジュールのインスタンスメソッド
(4)親クラスにさかのぼって探す
(5)クラス最上位までさかのぼって見つからなかったら
→object#method_missingを呼び出す
→NoMethodError例外発生
・モジュールのincludeもクラス継承の変形といえるので、
呼び出されるべきメソッドの探索はクラスの継承階層を
遡りながら行われるといってよい
■8.6.1 オーバーロードの不能性
・メソッドの特定はメソッド名のみによって行われる
→引数の数や型によるオーバーロードは不可能
・組み込みのArray#[]メソッド:オーバーロードではない
→とりあえず可変長の引数を受け取って、内部で引数の数やクラスを
調べて処理を振り分けている
・multi gemのような外部ライブラリの助けを借りれば、手で振り分け処理
を書かずとも実質的なオーバーロードを実現できる
8章 オブジェクトとクラス
8.6 メソッドの探索
から
■8.6 メソッドの探索
・オブジェクトがメッセージを受け取ったとき、
呼び出されるメソッドはどのように決定されるか
→基本的にはオブジェクトの属するクラスによって決定
(1)最初の候補は特異メソッド
(2)次に属するクラスのインスタンスメソッド
(3)includeしたモジュールのインスタンスメソッド
(4)親クラスにさかのぼって探す
(5)クラス最上位までさかのぼって見つからなかったら
→object#method_missingを呼び出す
→NoMethodError例外発生
・モジュールのincludeもクラス継承の変形といえるので、
呼び出されるべきメソッドの探索はクラスの継承階層を
遡りながら行われるといってよい
■8.6.1 オーバーロードの不能性
・メソッドの特定はメソッド名のみによって行われる
→引数の数や型によるオーバーロードは不可能
・組み込みのArray#[]メソッド:オーバーロードではない
→とりあえず可変長の引数を受け取って、内部で引数の数やクラスを
調べて処理を振り分けている
・multi gemのような外部ライブラリの助けを借りれば、手で振り分け処理
を書かずとも実質的なオーバーロードを実現できる