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
为 just private_m
。但是为什么会有所不同,self
里面不是 Foo 的一个实例public_m
吗?谁是空话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
给在谷歌追踪期间可以找到这个问题的任何人的消息:这可能会有所帮助 - http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby