Ruby - 受保护的方法

时间:2011-08-13 13:50:01

标签: 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.new
access.retrieve_protected

当我运行它时,我得到以下内容:

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

为什么?

感谢。

3 个答案:

答案 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受保护方法的真正处理是,您只能在“上下文”中使用显式接收器调用受保护的方法,这些类是您已定义这些方法的类或子类的实例。如果您尝试使用显式接收器调用受保护的方法,该接收器在上下文中不是您定义方法的类或子类,您将收到错误。