class Example
private
def example_test
puts 'Hello'
end
end
e = Example.new
e.example_test
这当然行不通,因为我们指定了显式接收者 - 示例的实例 (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 才会成为当前类的实例 - 在方法执行期间)。如果我理解有误,请纠正我。
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