Ruby保护方法

Ruby保护方法,ruby,protected,accessor,Ruby,Protected,Accessor,我有以下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.ne

我有以下
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)
accessor.rb:23:为#调用的受保护方法'retrieve_protected'(NoMethodError)
为什么呢


谢谢。

,因为您只能从该对象的实例方法或该类(或子类)的另一个对象内的直接调用受保护的方法


这就是Ruby中受保护方法的全部内容。只有当接收方是
self
或与
self
具有相同的类层次结构时,才能调用它们。受保护的方法通常在实例方法内部使用

您始终可以通过发送方法来规避此行为,例如

access.send(:retrieve_protected)

尽管这可能被认为是一种不好的做法,因为它故意规避程序员强加的访问限制。

Ruby中受保护的访问控制一开始可能会令人困惑。问题是,您经常会看到Ruby中受保护的方法只能由“self”的显式接收方或“self”类的子实例调用,不管该类是什么。但事实并非如此


Ruby保护方法的真正意义在于,您只能在“上下文”中使用显式接收器调用受保护方法,即您在其中定义这些方法的类或子类的实例。如果您试图使用显式接收器调用受保护的方法,而该接收器的上下文不是您定义方法的类或子类,则会出现错误。

您预期会发生什么?
access.send(:retrieve_protected)