Rubyのリフレクションプログラミングまとめ
タグ: ruby / 初版公開: 2013-12-13

Rubyは強力なリフレクション機能を持った言語であり、多様なリフレクション用メソッドが存在する。 このエントリではRubyでリフレクションプログラミングを行うためのメソッドを整理してみることにする。

オブジェクトに対する操作

インスタンス変数に関連する操作

インスタンス変数に対する操作には以下がある。

# メソッド 機能
1 instance_variables 一覧を取得する
2 instance_variable_defined? 定義の有無を確認する
3 instance_variable_get 値を参照する
4 instance_variable_set 値を設定する

メソッドに関連する操作

メソッドの一覧を表示する。取得するメソッドの種類毎に以下のメソッドがある。

# メソッド 取得するメソッドの種類
1 methods privateメソッド以外
2 public_methods publicメソッド
3 protected_methods protectedメソッド
4 private_methods privateメソッド
5 singleton_methods 特異メソッド

ある名前のメソッドが存在するかはrespond_to?で確認できる。

# メソッド 機能
1 respond_to? メソッドの有無を確認する

ある名前のメソッドを呼び出すにはsendまたは__send__が利用できる。

# メソッド 機能
1 send メソッドの呼出
2 send 同上

クラス/モジュールに対する操作

クラス変数に関連する操作

クラス変数に対する操作には以下がある。

# メソッド 機能
1 class_variables 一覧を取得する
2 class_variable_defined? 定義の有無を確認する
3 class_variable_get 値を参照する
4 class_variable_set 値を設定する

定数に関連する操作

定数に対する操作には以下がある。

# メソッド 機能
1 constants 一覧を取得する
2 const_get 定数を参照する
3 const_set 新たな定数を追加する

メソッドに関連する操作

メソッドの一覧を表示する。取得するメソッドの種類毎に以下のメソッドがある。

# メソッド 取得するメソッドの種類
1 methods クラスメソッド
2 instance_methods インスタンスメソッド
3 public_instance_methods publicインスタンスメソッド
4 protected_instance_methods protectedインスタンスメソッド
5 private_instance_methods privateインスタンスメソッド

ある名前のメソッドの定義の有無を確認する。確認するメソッドの種類毎に以下のメソッドがある。

# メソッド 確認するメソッドの種類
1 method_defined? privateメソッド以外
2 public_method_defined? publicメソッド
3 protected_method_defined? protectedメソッド
4 private_method_defined? privateメソッド

クラスやモジュールのインスタンスメソッドを削除または未定義化する以下のメソッドがある。

# メソッド 機能
1 remove_method メソッドを削除する
2 undef_method メソッドを未定義にする

継承に関連する操作

クラスの継承やincludeの情報を取得するメソッドには以下がある。

# メソッド 機能
1 ancestors メソッド探索の順序を取得する
2 superclass 親クラスを取得する
3 included_modules includeしているモジュールを取得する

クラス内で定義されたクラスのネスト構造はnestingで取得できる。

# メソッド 機能
1 nesting ネスト構造を深い方から浅い方の順で取得する

なおRubyのリフレクション機能については、パーフェクトRubyの10章に具体的な説明がある。 本エントリもパーフェクトRubyの10章を参考にまとめたものだ。 例を交えて非常にわかりやすく解説されているので、詳しく知りたい人はぜひ参照して欲しい。

パーフェクトRuby (PERFECT SERIES 6)
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 10,788