web-dev-qa-db-ja.com

`respond_to?`と `respond_to_missing?`

respond_to_missing?を定義するのではなく、respond_to?を定義することのポイントは何ですか?あるクラスのrespond_to?を再定義すると、何が問題になりますか?

43
sawa

respond_to_missing? が定義されていない場合、 method を介してメソッドを取得しようとすると失敗します。

class Foo
  def method_missing name, *args
    p args
  end

  def respond_to? name, include_private = false
    true
  end
end

f = Foo.new
f.bar  #=> []
f.respond_to? :bar  #=> true
f.method :bar  # NameError: undefined method `bar' for class `Foo'

class Foo
  def respond_to? *args; super; end  # “Reverting” previous redefinition

  def respond_to_missing? *args
    true
  end
end

f.method :bar  #=> #<Method: Foo#bar>

Marc-André (a Rubyコアコミッター)は良いです respond_to_missing?のブログ投稿

45
Andrew Marshall

method_missingをオーバーライドする場合は、respond_to_missing?を作成することをお勧めします。そうすれば、クラスは、明示的に宣言されていなくても、呼び出しているメソッドが存在することを通知します。

に対応する?おそらくオーバーライドすべきではありません:)

0
cesartalves