实例方法的两次调用带有不同的语义。对bar
的第一次调用按预期工作。
class T
def foo
bar # <= This works. "bar" is printed.
self.bar # <= EXCEPTION: `foo': private method `bar' called for ...
end
private
def bar
puts 'bar'
end
end
t = T.new
t.foo
我想了解原因。是什么导致self.bar
具有不同的语义,抛出异常?我对异常本身并不感兴趣,因为我可以解决private
标签的可疑删除问题,但主要是对语义讨论感兴趣。
答案 0 :(得分:4)
无法使用self
之类的显式接收器调用私有方法。这意味着您可以从声明的类中调用私有方法以及此类的所有子类。
Here是一篇很好的文章。它解释了为什么像你这样的代码会引发NoMethodError
。
在wikibooks上,对红宝石的可见度水平也有很好的解释。
作为参考,您可以使用Object#send绕过此值,但通常认为这样做是不好的做法。