定义类或其子类的任何实例都可以调用protected
个方法.
private
个方法只能从调用对象内部调用.不能直接访问另一个实例的私有方法.
下面是一个快速实用的例子:
def compare_to(x)
self.some_method <=> x.some_method
end
some_method
在这里不可能是private
.它必须是protected
,因为需要它来支持显式接收器.典型的internal helper方法通常可以是private
,因为它们永远不需要这样调用.
重要的是要注意,这与java或C++的工作方式不同.Ruby中的private
类似于Java/C++中的protected
,因为子类可以访问该方法.在Ruby中,无法像Java中的private
那样限制从子类访问方法.
无论如何,Ruby的可见性在很大程度上是一个"建议",因为你总是可以使用send
:
irb(main):001:0> class A
irb(main):002:1> private
irb(main):003:1> def not_so_private_method
irb(main):004:2> puts "Hello World"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> foo = A.new
=> #<A:0x31688f>
irb(main):009:0> foo.send :not_so_private_method
Hello World
=> nil