Puede que no sea tan obvio cómo responde_to? trabaja en ruby considerar que:respon_to? y métodos protegidos
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?
Así que si 'obj' responde a protected_method habrá que esperar
obj.protected_method
no levantar una excepción, no nosotros?
... pero plantea obviamente
documentación señala que llamar respond_to? con el segundo argumento establece en true método de registro privado, así
obj.respond_to?(:private_method, true)
# true
Y eso es mucho más razonable
Así que la pregunta es cómo comprobar si el objeto responde al método público solamente? ¿Hay alguna solución mejor que eso?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Es difícil para mí entender japonés traducido, pero de todos modos es bueno saber que el núcleo de ruby considera ese problema. Al menos uno puede usar obj.class.public_method_defined? (: Protected_method) y funciona como se esperaba, pero no manejará métodos singleton, por lo que más bien considero que como solución no real solución – mlomnicki
Respuesta actualizada con información actualizada –