Es kann nicht so offensichtlich sein, wie reply_to? arbeitet in Rubin. Bedenken Sie, dass:Antwort? und geschützte Methoden
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?
Also, wenn 'obj' auf protected_method reagiert sollten wir erwarten,
obj.protected_method
keine Ausnahme zu erhöhen, sollten wir nicht? offensichtlich
... aber es wirft
Dokumentation zeigt, dass respond_to Aufruf? mit 2. auf true Check private Methode gesetzt Argument auch
obj.respond_to?(:private_method, true)
# true
Und das ist viel vernünftiger
Die Frage ist also, wie Sie überprüfen, wenn das Objekt nur auf öffentliche Methode reagiert? Gibt es eine bessere Lösung?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Es ist schwer für mich zu verstehen, Japanisch übersetzt, aber trotzdem gut zu wissen, dass Rubin-Kern dieses Problem betrachten. Mindestens einer kann obj.class.public_method_defined? (: Protected_method) verwenden, und es funktioniert wie erwartet, aber nicht mit Singleton-Methoden, so dass ich eher als Umgehungslösung keine echte Lösung – mlomnicki
Antwort mit aktualisierten Informationen –