Il peut ne pas être si évident comment répondre à? travaille à ruby. Considérez que:répondez à? et méthodes protégées
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?
Donc, si 'obj' répond à protected_method nous devrions nous attendre
obj.protected_method
ne pas soulever une exception, ne devrait pas nous?
... mais il soulève évidemment
Documentation souligne que l'appel respond_to? avec 2 arguments à true contrôle méthode privée ainsi
obj.respond_to?(:private_method, true)
# true
Et qui est beaucoup plus raisonnable
La question est de savoir comment vérifier si l'objet répond à la méthode publique seulement? Y a-t-il une solution meilleure que cela?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Il est difficile pour moi de comprendre le japonais traduit mais de toute façon bon de savoir que le noyau de rubis considère ce problème. Au moins un peut utiliser obj.class.public_method_defined? (: Protected_method) et cela fonctionne comme prévu mais ne traitera pas les méthodes singleton, donc je considère plutôt que la solution de contournement n'est pas la vraie solution – mlomnicki
Réponse mise à jour avec les informations mises à jour –