Potrebbe non essere così ovvio come rispondere_to? lavora in rubino. Si consideri che:respond_to? e metodi protetti
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?
Quindi, se 'obj' risponde a protected_method dovremmo aspettarci
obj.protected_method
di non sollevare un'eccezione, non dovremmo?
... ma solleva ovviamente
documentazione sottolinea che chiamare respond_to? con 2 ° argomento impostata su true controllo metodo privato così
obj.respond_to?(:private_method, true)
# true
E questo è molto più ragionevole
Quindi la domanda è come controllare se l'oggetto risponde solo metodo pubblico? C'è una soluzione migliore di quella?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
È difficile per me capire il giapponese tradotto, ma comunque è bello sapere che il nucleo rubino considera quel problema. Almeno uno può usare obj.class.public_method_defined? (: Protected_method) e funziona come previsto ma non gestirà i metodi singleton, quindi preferisco considerarlo come soluzione alternativa non reale – mlomnicki
Risposta aggiornata con informazioni aggiornate –