Rubyでレシーバのオブジェクトに対してメソッドの呼び出し可能か調べたいのです。
分かる方よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
メソッドを調べるやり方は 3 通りほどあります。
defined?
: メソッドだけでなく汎用的に使えるrespond_to?
: オブジェクトに対して調べるmethod_defined?
: クラスに対して定義されているか調べる。
(xxxx_method_defined? でアクセス制限ごとにも調べられる)
lang
1class Foo 2 def bar 3 end 4end 5 6obj = Foo.new 7 8p defined? obj.bar # "method" : true/false ではないが、真偽判定では true 9 10p obj.respond_to?(:bar) # true 11 12p Foo.method_defined?(:bar) # true 13p Foo.public_method_defined?(:bar) # true 14p Foo.protected_method_defined?(:bar) # false 15p Foo.private_method_defined?(:bar) # false 16p obj.class.method_defined?(:bar) # true (オブジェクトからクラスを取得して使う)
ご質問の「オブジェクトに対して」ということであれば defined?
か respond_to?
になります。
どちらを使うかは好みだと思います。個人的には 1 つ覚えているといろいろなものに対して使えるので、defined?
を使っています。
投稿2014/09/22 06:54
総合スコア863
0
既に respond_to? を使う回答がありますが、respond_to? で メソッドを名指しで調べるだけでなく、
methods で呼び出し可能なメソッド名を調べることもできます。
Ruby リファレンス 標準クラス・モジュール > Object > respond_to? http://ref.xaio.jp/ruby/classes/object/respond_to
...
obj.respond_to?(name, private = false)
respond_to?メソッドは、レシーバのオブジェクトに対してメソッドを呼び出せるかどうかを調べます。
引数nameにはメソッド名をシンボルか文字列で指定します。メソッドnameを持っていればtrue、なければfalseが返ります。
レシーバのクラスのメソッドだけでなく、親クラスやインクルードしているモジュールのメソッドも対象になります。
デフォルトではpublicなメソッドとprotectedなメソッドを調べますが、第2引数にtrueを指定するとprivateなメソッドも含めて調べます。
...
Ruby リファレンス 標準クラス・モジュール > Object > methods http://ref.xaio.jp/ruby/classes/object/methods
...
obj.methods(all = true)
methodsメソッドは、レシーバが持っているメソッドの名前を集めて配列にして返します。
配列に含まれるのはpublicなメソッドかprotectedなメソッドです。privateなメソッドは含まれません。
レシーバのクラスのメソッドだけでなく、親クラスやインクルードしているモジュールのメソッドも含まれます。
配列には特異メソッドも含まれます。引数にfalseを指定すると、singleton_methodsメソッドにfalseを渡したときと同じく、特異メソッドだけの配列が返ります。
...
投稿2014/09/20 04:44
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/09/24 00:40