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

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

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

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

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

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

メソッドに関連する操作

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

#メソッド取得するメソッドの種類
1methodsprivateメソッド以外
2public_methodspublicメソッド
3protected_methodsprotectedメソッド
4private_methodsprivateメソッド
5singleton_methods特異メソッド

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

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

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

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

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

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

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

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

定数に関連する操作

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

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

メソッドに関連する操作

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

#メソッド取得するメソッドの種類
1methodsクラスメソッド
2instance_methodsインスタンスメソッド
3public_instance_methodspublicインスタンスメソッド
4protected_instance_methodsprotectedインスタンスメソッド
5private_instance_methodsprivateインスタンスメソッド

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

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

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

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

継承に関連する操作

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

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

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

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

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

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