Почему я могу получить доступ к закрытым / защищенным методам, используя Object # send в Ruby?

Класс
class A

  private
  def foo
    puts :foo
  end

  public
  def bar
    puts :bar
  end

  private
  def zim
    puts :zim
  end

  protected
  def dib
    puts :dib
  end
end
экземпляр А
a = A.new
тестовое задание
a.foo rescue puts :fail
a.bar rescue puts :fail
a.zim rescue puts :fail
a.dib rescue puts :fail
a.gaz rescue puts :fail
тестовый вывод
fail
bar
fail
fail
fail
. отправить тест
[:foo, :bar, :zim, :dib, :gaz].each { |m| a.send(m) rescue puts :fail }
. отправить вывод
foo
bar
zim
dib
fail
Вопрос

Раздел с пометкой «Результат теста» является ожидаемым результатом. Так почему я могу получить доступ к закрытому / защищенному методу, простоObject#send?

Возможно, важнее:

В чем разница междуpublic/private/protected в рубине? Когда использовать каждый? Может ли кто-нибудь привести примеры из реальной жизни?private а такжеprotected использование?

Ответы на вопрос(1)

Ваш ответ на вопрос