在 Ruby 中,我的理解是它self
是任何裸方法调用的隐含接收器。然而:
~: irb
>> puts "foo"
foo
=> nil
>> self.puts "foo"
NoMethodError: private method `puts' called for main:Object
这是什么解释?
如果有任何帮助:
>> method(:puts).owner
=> Kernel
在 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
总是创建一个局部变量,所以你可以调用私有 setter ,因为否则你根本self.foo = bar
无法调用它们(不使用反射)。
self
当您没有明确指定一个时,您是正确的,这是隐含的接收者。不允许您这样做的原因是您不能self.puts
使用显式接收器调用私有方法(即使该接收器是self
),并且正如错误消息所述,puts
它是私有方法。
您不能使用self.
语法访问 ruby 中的私有方法,或者一般来说使用任何接收器(前面的东西.
)。这仅适用于受保护的方法。