我错过了什么吗?
class Circus
private
def start
puts 'And now for something completely different..'
end
end
Run Code Online (Sandbox Code Playgroud)
而我的幻灭:
c=Circus.new
c.start #NoMethodError: private method `start' called
c.method(:start).call #no problem at all
c.send :start #neither this fails
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我Ruby中存在私有方法的原因吗?
mea*_*gar 11
这样说吧.在Ruby中,您可以轻松地将公共方法修补为调用私有方法的类,因此......为什么会 private阻止您的行为?
你似乎认为private方法在某种程度上是一种安全性的东西,它们必须在课外无法访问.封装不是关于安全性的,是一种用于生成干净,可维护代码的工具.由您来尊重类暴露的界面.如果你真的想找到一种方法来调用私有方法,你会的.Ruby不能完全强制执行,也不应该执行 ; 这会适得其反,浪费时间.
我的意思是,任何人都可以给我至少一个为什么'私人'甚至存在于Ruby中的原因?
由于完全相同的原因private存在于任何其他基于OOP的语言中:封装.真的,你认为只是因为你可以找到一种令人费解的方式来规避private,它应该被抛弃?
它声明了该方法的意图.如果它是私人的,你不应该打电话给它,你应该知道这样做可能会导致不可预测或不良行为.
对于它的价值,这种行为不仅限于Ruby - 也可以通过Reflection API访问Java中的私有成员和变量.