为什么 Ruby 实例方法调用在带有 'self' 前缀时表现不同?

Why do Ruby instance method invocations behave differently when prefixed with 'self'?

实例方法的两次调用具有不同的语义。对 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 标签的可疑删除问题,但主要对语义讨论感兴趣。

私有方法不能像 self 那样用显式接收器调用。这意味着您可以从声明的 class 以及此 class 的所有子 class 中调用私有方法。

Here 是一篇关于此的好文章。它很好地解释了为什么像您这样的代码会引发 NoMethodError

wikibooks 上,ruby 中也对可见度级别进行了很好的解释。

作为参考,您可以使用 Object#send 绕过它,但通常认为这样做是一种不好的做法。