班上
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 = A.new
test
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
?
也许更重要的是:
有什么区别public
/private
/protected
在鲁比?何时分别使用?有人可以提供现实世界的例子吗private
and protected
usage?
技术上:因为send
不做任何事情来检查方法的可见性。 (这样做会需要更多工作。)
从哲学上来说:Ruby 是一种非常宽容的语言。您已经可以打开一个类并将任何您想要的方法公开。语言设计者实现的send
以一种允许它超越通常施加的限制的方式private
。 Ruby 1.9 最初有两个变体,一个private
-尊重send
和一个不安全的变体称为send!
,但这显然是为了向后兼容而被放弃的。
至于什么private
, protected
and public
mean:
-
public
任何发送者都可以调用方法
-
protected
不能在方法所在类的实例或子类的实例之外调用方法
-
private
不能使用显式接收器调用方法(有几个例外,例如 setter 方法,它始终必须有显式接收器,因此可以通过这种方式在类中调用)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)