【发布时间】:2025-12-02 04:30:01
【问题描述】:
class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
这当然行不通,因为我们指定了明确的接收者 - Example 的实例 (e),这违反了“私人规则”。
但我无法理解,为什么在 Ruby 中不能这样做:
class Foo
def public_m
self.private_m # <=
end
private
def private_m
puts 'Hello'
end
end
Foo.new.public_m
public_m 方法定义中的当前对象(即self)是 Foo 的实例。那么为什么不允许呢?要解决这个问题,我必须将 self.private_m 更改为 private_m。但是为什么会有所不同,self 不是public_m 中的 Foo 实例吗?谁是空话private_m 电话的接收者?这不是self - 实际上你省略了什么,因为 Ruby 会为你做这件事(会在 self 上调用 private_m)?
我希望我没有把它弄糊涂,我对 Ruby 还是很陌生。
编辑:
谢谢你的所有答案。将它们放在一起,我能够(最终)理解显而易见的事情(对于从未见过像 Ruby 这样的东西的人来说并不那么明显):self 本身可以是
显式和隐式接收器,这会有所不同。所以有两个规则,如果你想调用一个私有方法:self 必须是隐式接收者,并且 self 必须是当前类的实例(Example 在这种情况下 - 并且只有当 self 如果在里面时才会发生实例方法定义,在此方法执行期间)。如果我错了,请纠正我。
class Example
# self as an explicit receiver (will throw an error)
def explicit
self.some_private_method
end
# self as an implicit receiver (will be ok)
def implicit
some_private_method
end
private
def some_private_method; end
end
Example.new.implicit
给在 google 跟踪期间可以找到此问题的任何人的消息:这可能会有所帮助 - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
【问题讨论】:
-
Here 是一个非常相似的问题。
标签: ruby access-specifier