为什么在使用'self'作为前缀时,Ruby实例方法调用的行为会有所不同?

时间:2018-04-05 18:47:34

标签: ruby self instances instance-methods

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

1 个答案:

答案 0 :(得分:4)

无法使用self之类的显式接收器调用私有方法。这意味着您可以从声明的类中调用私有方法以及此类的所有子类。

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

wikibooks上,对红宝石的可见度水平也有很好的解释。

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