Рубин - Защищенный метод - PullRequest
4 голосов
/ 13 августа 2011

У меня есть следующая Ruby программа:

class Access

def retrieve_public
puts "This is me when public..."
end

private
def retrieve_private
puts "This is me when privtae..."
end

protected
def retrieve_protected
puts "This is me when protected..."
end

end


access = Access.new
access.retrieve_protected

Когда я запускаю его, я получаю следующее:

accessor.rb:23: protected method `retrieve_protected' called for #<Access:0x3925
758> (NoMethodError)

Почему это?

Спасибо.

Ответы [ 3 ]

14 голосов
/ 13 августа 2011

Поскольку вы можете вызывать защищенные методы напрямую только из внутри метода экземпляра этого объекта или другого объекта этого класса (или подкласса)

class Access

  def retrieve_public
    puts "This is me when public..."
    retrieve_protected

    anotherAccess = Access.new
    anotherAccess.retrieve_protected 
  end

end

#testing it

a = Access.new

a.retrieve_public

# Output:
#
# This is me when public...
# This is me when protected...
# This is me when protected...
11 голосов
/ 13 августа 2011

Вот что такое защищенные методы в Ruby.Они могут быть вызваны, только если получатель self или имеет ту же иерархию классов, что и self.Защищенные методы обычно используются внутри методов экземпляра.

См. http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Protected

Вы всегда можете обойти это поведение, отправив метод, например

access.send(:retrieve_protected)

Хотя этосчитается плохой практикой, поскольку она намеренно обходит ограничения доступа, наложенные программистом.

0 голосов
/ 19 января 2014

Поначалу защищенный контроль доступа в Ruby может сбить с толку.Проблема в том, что вы часто читаете защищенные методы в Ruby и могут вызываться только явным получателем «self» или под экземпляром класса «self», каким бы ни был этот класс.И это не совсем так.

Реальная сделка с методами, защищенными Ruby, заключается в том, что вы можете вызывать защищенные методы только с явным получателем в «контексте» экземпляров класса или подклассов, которые вы 'мы определили эти методы в. Если вы попытаетесь вызвать защищенный метод с явным получателем в контексте, который не является классом или подклассами, где вы определили методы, вы получите ошибку.

...