6

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

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

这是什么解释?

如果有任何帮助:

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

4 回答 4

8

私有方法不能有接收者

我认为答案是这样的: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. 这就是执行方法隐私的方式。

于 2012-07-24T14:04:12.620 回答
4

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

实际上,这条规则有一个例外:因为foo = bar 总是创建一个局部变量,所以你可以调用私有 setter ,因为否则你根本self.foo = bar无法调用它们(不使用反射)。

于 2012-07-24T14:55:37.820 回答
3

self当您没有明确指定一个时,您是正确的,这是隐含的接收者。不允许您这样做的原因是您不能self.puts使用显式接收器调用私有方法(即使该接收器是self),并且正如错误消息所述,puts它是私有方法。

于 2012-07-24T13:59:59.733 回答
1

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

于 2012-07-24T14:00:04.017 回答