class A
private
def foo
puts :foo
end
public
def bar
puts :bar
end
private
def zim
puts :zim
end
protected
def dib
puts :dib
end
end
a = A.new
a.foo rescue puts :fail
a.bar rescue puts :fail
a.zim rescue puts :fail
a.dib rescue puts :fail
a.gaz rescue puts :fail
fail
bar
fail
fail
fail
[:foo, :bar, :zim, :dib, :gaz].each { |m| a.send(m) rescue puts :fail }
foo
bar
zim
dib
fail
标记为“测试输出”的部分是预期结果。那么为什么我只能通过Object#send
访问私有/受保护的方法?
Ruby中的public
/ private
/ protected
有什么区别?什么时候使用?有人可以提供private
和protected
用法的真实示例吗?
答案 0 :(得分:8)
技术上:因为send
无法检查方法可见性。 (这样做会有更多的工作。)
哲学上:Ruby是一种非常宽松的语言。您已经可以打开课程并制作任何想要公开的方法。语言设计者以允许它覆盖send
通常强加的限制的方式实现private
。 Ruby 1.9最初将有两个变体,private
- 尊重send
和一个名为send!
的不安全变体,但由于向后兼容性,这显然已被删除。
至于private
,protected
和public
是什么意思:
public
方法可由任何发件人调用protected
方法不能在方法类的实例或子类的实例之外调用private
方法不能使用显式接收器调用(有一些例外,例如setter方法,它们总是必须有一个显式接收器,因此可以在类中调用)