我有以下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)
为什么?
感谢。
答案 0 :(得分: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...
答案 1 :(得分:11)
这是Ruby中受保护方法的全部内容。只有当接收者为self
或与self
具有相同的类层次结构时,才能调用它们。受保护的方法通常在实例方法内部使用。
请参阅http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Protected
您可以通过发送方法来避免此行为,例如:
access.send(:retrieve_protected)
虽然这可能被认为是不好的做法,因为它故意绕过程序员强加的访问限制。
答案 2 :(得分:0)
Ruby中受保护的访问控制一开始可能会令人困惑。问题是你经常阅读Ruby中的受保护方法只能通过“self”的显式接收者或“self”类的子实例调用,无论该类可能是什么类。这并不完全正确。
对Ruby受保护方法的真正处理是,您只能在“上下文”中使用显式接收器调用受保护的方法,这些类是您已定义这些方法的类或子类的实例。如果您尝试使用显式接收器调用受保护的方法,该接收器在上下文中不是您定义方法的类或子类,您将收到错误。