Może nie być tak oczywiste, jak reagować? działa w ruby. Uważają, że:respond_to? i chronione metody
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?
Więc jeśli 'obj' jest odpowiedzią na protected_method powinniśmy oczekiwać
obj.protected_method
nie zgłaszać wyjątek, nie powinniśmy?
... ale budzi oczywiście
dokumentacja wskazuje, że wywołanie respond_to? Argument z 2-ty ustawiony prawdziwego wyboru metody prywatnym, jak również
obj.respond_to?(:private_method, true)
# true
I to o wiele bardziej rozsądne
Więc pytanie brzmi, jak sprawdzić, czy obiekt odpowiada jedynej metody publicznych? Czy istnieje lepsze rozwiązanie?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Ciężko mi zrozumieć przetłumaczony japoński, ale dobrze wiedzieć, że rubinowy rdzeń rozważa tę kwestię. Przynajmniej jeden może użyć obiektu obj.class.public_method_defined? (: Protected_method) i działa zgodnie z oczekiwaniami, ale nie będzie obsługiwał metod singleton, więc uważam, że jako obejście rozwiązanie nie jest prawdziwe – mlomnicki
Odpowiedź zaktualizowana o zaktualizowane informacje –