Это не может быть настолько очевидно как respond_to? работы в рубине. Полагайте что:
class A
def public_method
end
protected
def protected_method
end
private
def private_method
end
end
obj = A.new
obj.respond_to?(:public_method)
# true - that's pretty obvious
obj.respond_to?(:private_method)
# false - as expected
obj.respond_to?(:protected_method)
# true - WTF?
Таким образом, если 'obj' ответит на protected_method, то мы должны ожидать
obj.protected_method
не повысить исключение, не так ли?
... но это повышает, очевидно,
Документация указывает на тот вызов respond_to? с 2-м набором аргумента к истинному закрытому методу проверки также
obj.respond_to?(:private_method, true)
# true
И это намного более разумно
Таким образом, вопрос состоит в том, как проверить, отвечает ли объект на открытый метод только? Существует ли решение лучше, чем это?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Это обсуждается, должен ли response_to?
искать защищенные методы или нет (проверьте эту проблему )
Матц заявил, что это, вероятно, изменится в Ruby 2.0.
Обратите внимание, что некоторые классы могут использовать #method_missing
и специализировать #respond_to?
(или лучше указать #respond_to_missing?
в Ruby 1.9.2+), в этом случае ваш obj.methods.include?
не будет надежным.