如果`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.
语法,或者一般来说使用任何接收器(前面的东西)。 这仅适用于受保护的方法。