实例方法的两次调用具有不同的语义。对 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
标签的问题,但主要对语义讨论感兴趣。
最佳答案
私有(private)方法不能用像self
这样的显式接收者来调用。这意味着您可以从声明它的类以及该类的所有子类中调用私有(private)方法。
Here是一篇关于此的好文章。它很好地解释了为什么像您这样的代码会引发 NoMethodError
。
关于 wikibooks ruby 中的可见性级别也有很好的解释。
作为引用,您可以使用 Object#send 绕过它但通常认为这样做是一种不好的做法。
关于ruby - 为什么 Ruby 实例方法调用在以 'self' 为前缀时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49679411/