2011-08-13 4 views
3

У меня есть следующие 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) 

Почему?

Спасибо.

+1

Что вы ожидали от вас? –

ответ

14

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

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... 
10

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

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

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

access.send(:retrieve_protected) 

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

0

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

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

Смежные вопросы