パーフェクトRubyお勉強フェスティバル 第9章 「Methodクラス」
600ページくらいあるこの本もやっと折り返し地点…
「Methodクラス」はさらっと行けそうです.サラッと書きます.
Methodオブジェクト
オブジェクトの持つメソッドをオブジェクトとして扱うのが「Methodオブジェクト」であり,取得はObject#methodにより行う.
なおここで取得されたMethodオブジェクトは「メソッドの処理そのもの」を保持しているものなので,オープンクラスや特異メソッドでオーバーライドしても影響は受けない.
Methodオブジェクトからは引数の情報,メソッドの定義されたクラスまたはモジュール,メソッド名,レシーバ,メソッドがオーバーライドしたメソッドなどの情報を得ることができる.
UnboundMethod
Methodオブジェクトからレシーバの情報を除いたのがUnboundMethodオブジェクトである.Module#instance_methodかModule#unbindを使う.
実行するときはUnboundMethod#bindにレシーバにしたいオブジェクトを引数として渡す.
Methodオブジェクトの使い道
Procオブジェクトは前回記事(パーフェクトRubyお勉強フェスティバル 第8章 「Procオブジェクト」 - おふとん王国)でクロージャとして使うことがわかったがMethodオブジェクトの使い道とはなんだろう.
Methodオブジェクトが実際に使われている例としてメソッドに渡された引数の数に応じて処理を変更する,というのが挙げられていた.こういうのはJavaだったらオーバーロードで解決できるけど,Rubyにはオーバーロードは存在しないんですよね…なるほど.
ProcやMethodの違いを深く理解しておく.