如果`self`总是Ruby中隐含的接收者,为什么`self.puts`不起作用?

在Ruby中,我的理解是self是任何裸方法调用的隐含接收器。 然而:

 ~: irb >> puts "foo" foo => nil >> self.puts "foo" NoMethodError: private method `puts' called for main:Object 

这解释了什么?

万一有任何帮助:

 >> method(:puts).owner => Kernel 

私有方法不能有接收器

我认为答案是这样的:Ruby实施方法隐私的方式是它不允许使用显式接收器调用私有方法。

一个例子:

 class Baker def bake_cake make_batter self.use_oven # will explode: called with explicit receiver 'self' end private def make_batter puts "making batter!" end def use_oven puts "using oven!" end end b = Baker.new b.bake_cake 

由于没有明确的接收器,你当然不能做b.use_oven 。 这就是方法隐私的实施方式。

因为这是Ruby中隐私的定义:私有方法只能用隐式接收器调用。

实际上,这个规则有一个例外:因为foo = bar 总是创建一个局部变量,你可以调用像self.foo = bar这样的私人设置器,因为否则你根本就无法调用它们(不使用reflection) )。

如果你没有明确指定self ,那么self是默认的接收器是正确的。 您不被允许执行self.puts的原因是您不能使用显式接收器调用私有方法(即使该接收者是self )并且如错误消息所示, puts是私有方法。

您无法使用self.访问ruby中的私有方法self. 语法,或者一般来说使用任何接收器(前面的东西)。 这仅适用于受保护的方法。