respond_to? и защищенные методы

Это не может быть настолько очевидно как respond_to? работы в рубине. Полагайте что:


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?

Таким образом, если 'obj' ответит на protected_method, то мы должны ожидать

obj.protected_method

не повысить исключение, не так ли?

... но это повышает, очевидно,

Документация указывает на тот вызов respond_to? с 2-м набором аргумента к истинному закрытому методу проверки также

obj.respond_to?(:private_method, true)
# true

И это намного более разумно

Таким образом, вопрос состоит в том, как проверить, отвечает ли объект на открытый метод только? Существует ли решение лучше, чем это?

obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
15
задан Andrew Grimm 27 March 2012 в 23:44
поделиться

1 ответ

Это обсуждается, должен ли response_to? искать защищенные методы или нет (проверьте эту проблему )

Матц заявил, что это, вероятно, изменится в Ruby 2.0.

Обратите внимание, что некоторые классы могут использовать #method_missing и специализировать #respond_to? (или лучше указать #respond_to_missing? в Ruby 1.9.2+), в этом случае ваш obj.methods.include? не будет надежным.

8
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: