1. ホーム
  2. ルビー

[解決済み】クラスが与えられたら、インスタンスがメソッドを持っているかどうか確認する(Ruby)

2022-04-16 10:04:29

質問

私は、Rubyで respond_to? を使用して、あるオブジェクトが特定のメソッドを持っているかどうかをチェックします。

しかし、クラスが与えられたとして、そのインスタンスがあるメソッドを持っているかどうかを確認するにはどうすればよいでしょうか?

つまり、次のようなものです。

Foo.new.respond_to?(:bar)

でも、新しいインスタンスを作るより、もっといい方法があるような気がするんだ。

どのように解決するのか?

なぜか、みんなは instance_methodsinclude? としたとき method_defined? が仕事をします。

class Test
  def hello; end
end

Test.method_defined? :hello #=> true

ノート

他のOO言語からRubyに移行する場合、または、以下のように考えている場合。 method_defined で明示的に定義したメソッドのみを意味します。

def my_method
end

を読んでから、これを読んでください。

Rubyでは、モデル上のプロパティ(属性)は、基本的にメソッドでもあるのです。だから method_defined? は、プロパティに対しても真を返します。 メソッドだけでなく

例えば

String属性を持つクラスのインスタンスがある場合 first_name :

<instance>.first_name.class #=> String

<instance>.class.method_defined?(:first_name) #=> true

から first_name は属性とメソッドの両方です(そしてString型の文字列です)。