Возможно, это не так очевидно, как response_to? работает в рубине. Считают, что:reply_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? с вторым аргументом установлен истинной проверкой частного метода, а
obj.respond_to?(:private_method, true)
# true
И это гораздо более разумно
Поэтому вопрос заключается в том, чтобы проверить, если объект отвечает только открытому методу? Есть ли решение лучше, чем это?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Мне сложно понять, что переведенный японский язык, но в любом случае хорошо знать, что рубиновый стержень рассматривает эту проблему. По крайней мере, один может использовать obj.class.public_method_defined? (: Protected_method), и он работает так, как ожидалось, но не будет обрабатывать однотонные методы, поэтому я скорее считаю это как workaround не реальное решение – mlomnicki
Отвечено обновлено с обновленной информацией –