为什么 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 绕过它,但通常认为这样做是一种不好的做法。
实例方法的两次调用具有不同的语义。对 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 绕过它,但通常认为这样做是一种不好的做法。