Это может быть не так очевидно, как response_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
не выдвигать исключения, не так ли?
... но, очевидно, поднимается
Документация указывает, что вызывает response_to? со вторым аргументом, установленным в true, также проверьте приватный метод
obj.respond_to?(:private_method, true)
# true
И это гораздо разумнее
Итак, вопрос в том, как проверить, отвечает ли объект только на публичный метод?
Есть ли решение лучше, чем это?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false