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

标签 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 标签的问题,但主要对语义讨论感兴趣。

最佳答案

私有(private)方法不能用像self这样的显式接收者来调用。这意味着您可以从声明它的类以及该类的所有子类中调用私有(private)方法。

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

关于 wikibooks ruby 中的可见性级别也有很好的解释。

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

关于ruby - 为什么 Ruby 实例方法调用在以 'self' 为前缀时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49679411/

相关文章:

ruby - gem 安装 compass 不起作用

python - 将父类的自身更改为子类

Ruby:如何编写像 map 这样的 bang 方法?

python - 在 python 中从列表中删除类实例有困难

java - 如何使用实例引用实例?

ruby-on-rails - rails has_one 通过关系不存在

html - 如何使用 "template" Controller 创建页面并在 VoltRb 中查看

ruby-on-rails - Rails 中的常量值

xcode - UIViewcontroller 的 "self"对象在 xcode 的调试窗口中有 @ "0 objects"

java - HashMap 对象 ~ myMap 是在公共(public) Java 方法中创建的