質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

2073閲覧

Ruby レシーバのオブジェクトに対してメソッドの呼び出し可能か調べたい

huang_2014

総合スコア34

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2014/09/19 13:59

Rubyでレシーバのオブジェクトに対してメソッドの呼び出し可能か調べたいのです。
分かる方よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yohshiy

総合スコア863

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

huang_2014

2014/09/24 00:40

ありがとうございました!参考にさせていただきます!
guest

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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

**respond_to?**メソッドを使えば調べられますよ。
メソッドを持っていればtrueを返し、持っていなければ、falseを返すメソッドです。

投稿2014/09/19 14:53

poppo23

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問