在阅读this article之前,我认为Ruby中的访问控制是这样工作的:
public
-可由任何对象访问(例如Obj.new.public_method
)protected
-只能从对象本身以及任何子类中访问private
-与protected相同,但子类中不存在该方法
然而,protected
和private
的行为似乎是一样的,除了你不能用显式接收器调用private
方法(即self.protected_method
工作,而self.private_method
不工作)。
这有什么意义呢?什么时候会有这样的场景,你不希望你的方法被显式的接收者调用?
8条答案
按热度按时间ev7lccsx1#
protected
方法可以由定义类或其子类的任何示例调用。只能从调用对象内部调用
private
方法。不能直接访问其他示例的私有方法。下面是一个快速的实际示例:
some_method
在这里不能是private
。它必须是protected
,因为您需要它来支持显式接收器。您的典型内部帮助器方法通常可以是private
,因为它们从来不需要这样调用。需要注意的是,这与Java或C的工作方式不同。Ruby中的
private
与Java/C中的protected
类似,因为它们的子类可以访问方法。在Ruby中,无法像Java中的private
那样限制从子类访问方法。Ruby中的可见性在很大程度上是一个“建议”,因为你总是可以使用
send
来访问一个方法:dxxyhpgq2#
区别
self
的隐式接收方调用。即使你也不能调用self.some_private_method
;你必须调用private_method
并隐含self
。self
接收器可以是显式的,self.some_private_method
是允许的(任何其他显式接收器仍然是不允许的,即使运行时值与self
相同)。在Ruby中,这些区别只是程序员之间的建议。**非公共方法是一种表达“我保留更改此方法的权利;don 't dependent it."**但是您仍然可以得到
send
的锋利剪刀,并且可以调用任何您喜欢的方法。一个简短的教程
然后您可以运行
ruby dwarf.rb
并执行以下操作:vxqlmq5t3#
Ruby中的私有方法:
如果一个方法在Ruby中是私有的,那么它不能被显式的接收者(对象)调用,只能被隐式调用,它可以被描述它的类以及该类的子类隐式调用。
下面的例子将更好地说明这一点:
1)具有私有方法class_name的Animal类
在这种情况下:
2)两栖类动物的一个亚纲:
在这种情况下:
正如你所看到的,私有方法只能被隐式调用,它们不能被显式的接收者调用,同样的原因,私有方法也不能在定义类的层次结构之外被调用。
Ruby中的受保护方法:
如果一个方法在Ruby中是受保护的,那么它可以被定义类和它的子类隐式调用。另外,它们也可以被显式接收者调用,只要接收者是self或者与self属于同一个类:
1)具有受保护方法protect_me的Animal类
在这种情况下:
2)从动物纲继承而来的哺乳动物纲
在这种情况下
3)从动物纲继承而来的两栖纲(与哺乳纲相同)
在这种情况下
4)一个叫Tree的类
在这种情况下:
k4aesqcs4#
考虑Java中的一个私有方法,当然,它可以从同一个类中调用,但也可以被同一个类的另一个示例调用:
所以--如果调用者是同一个类的另一个示例--可以说,我的私有方法实际上是可以从“外部”访问的,这实际上使它看起来不那么私有。
另一方面,在Ruby中,私有方法实际上意味着只对当前示例是私有的,这就是删除显式接收器选项所提供的。
另一方面,我应该明确指出,在Ruby社区中,根本不使用这些可见性控件是很常见的,因为Ruby无论如何都会给你提供绕过这些控件的方法。与Java世界不同,现在的趋势是让所有东西都可以访问,并相信其他开发人员不会把事情搞砸。
camsedfj5#
□ □有什么区别?
解释私有方法
我们可以问Freddie,事情进展如何,因为这是一个公开的方法,这是完全有效的,这是正常的,可以接受的。
但是......唯一能知道弗雷迪内裤情况的人,就是弗雷迪自己。随便一个陌生人把手伸进弗雷迪的内裤是不行的--不,不--这是非常非常隐私的,我们不想把隐私暴露给外界。换句话说,我们可能不想把可变数据暴露给世界上的任何调用者。有人可能会改变一个值,我们会在痛苦的世界里试图找出虫子的来源。
受保护方法说明
想想这个:
我们对
mrs
获取我们的信用卡详细信息有点满意,因为mrs
是我们的血肉之躯,继承自Person,所以她可以在一些鞋子等上搞砸,但我们不希望随机的个人获取我们的信用卡详细信息。如果我们试图在子类之外这样做,它将失败:
总结
huwehgph6#
在Ruby中,私有方法可以被子类访问的部分原因是Ruby对类的继承是对Module includes的一层薄薄的糖衣, -在Ruby中,类实际上是一种提供继承的模块,等等。
http://ruby-doc.org/core-2.0.0/Class.html
这意味着子类基本上“包含”父类,因此父类的函数(* 包括私有函数 *)也在子类中定义。
在其他编程语言中,调用一个方法需要将方法名向上冒泡到父类层次结构中,并找到响应该方法的第一个父类。相反,在Ruby中,当父类层次结构仍然存在时,父类的方法直接包含在子类定义的方法列表中。
1tu0hz3e7#
**Java与Ruby的访问控制比较:**如果方法在Java中声明为private,则只能由同一个类中的其他方法访问。如果方法声明为protected,则可以由同一个包中的其他类以及不同包中该类的子类访问。当方法为public时,所有人都可以看到该方法。在Java中,访问控制可见性概念取决于这些类在继承/包层次结构中的位置。
而在Ruby中,继承层次结构或包/模块并不合适,关键在于哪个对象是方法的接收者。
对于Ruby中的私有方法,它永远不能用显式接收器调用。我们只能用隐式接收器调用私有方法。
这也意味着我们可以从声明私有方法的类以及该类的所有子类中调用私有方法。
永远不能从定义私有方法的类层次结构外部调用该方法。
受保护的方法可以用隐式接收方调用,就像private一样。此外,受保护的方法还可以由显式接收方调用(仅当接收方是“self”或“同一类的对象”时)。
摘要
公共:公共方法具有最大可见性
Protected:Protected方法可以用隐式接收方调用,就像private一样。此外,Protected方法也可以被显式接收方调用,(仅)当接收方是“self”或“同一类的对象”时。
Private:对于Ruby中的私有方法来说,它永远不能被显式接收器调用。我们只能用隐式接收器调用私有方法。这也意味着我们可以从声明私有方法的类以及该类的所有子类中调用私有方法。
yacmzcpb8#
前三种类型的访问说明符和定义其作用域的说明符。
1.公共-〉访问类之外的任何地方。
1.私有-〉不能访问类的外部。
1.保护-〉此方法不能访问此方法定义范围的任何地方。
但我有一个解决这个问题的所有方法如何访问深入解释。
1.对象列表
1.列表项