respond_to_missing?
を定義するのではなく、respond_to?
を定義することのポイントは何ですか?あるクラスのrespond_to?
を再定義すると、何が問題になりますか?
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?
のブログ投稿 。
method_missingをオーバーライドする場合は、respond_to_missing?を作成することをお勧めします。そうすれば、クラスは、明示的に宣言されていなくても、呼び出しているメソッドが存在することを通知します。
に対応する?おそらくオーバーライドすべきではありません:)