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)
posted with amazlet at 13.12.01
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 10,788
技術評論社
売り上げランキング: 10,788