53

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

4

2 に答える 2

54

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é(Rubyコアコミッター)には、に関する優れたブログ投稿がrespond_to_missing?あります。

于 2012-12-10T00:52:03.730 に答える
3

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

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

于 2019-11-06T14:28:49.813 に答える