Подтвердить что ты не робот

`response_to?` против `response_to_missing?`

В чем смысл определения respond_to_missing? в отличие от определения respond_to?? Что не так, если вы переопределяете respond_to? для некоторого класса?

4b9b3361

Ответ 1

Без 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 core) имеет хорошее сообщение в respond_to_missing?.