selfRuby では、これがベア メソッド呼び出しの暗黙のレシーバーであると理解しています。でも:
~: irb
>> puts "foo"
foo
=> nil
>> self.puts "foo"
NoMethodError: private method `puts' called for main:Object
これを説明するものは何ですか?
それが助けになる場合:
>> method(:puts).owner
=> Kernel
selfRuby では、これがベア メソッド呼び出しの暗黙のレシーバーであると理解しています。でも:
~: 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できます。
self明示的に指定しない場合、それは暗黙の受信者です。許可されていない理由はself.puts、明示的なレシーバーを使用してプライベート メソッドを呼び出すことはできず (そのレシーバーが であってもself)、エラー メッセージputsが示すようにプライベート メソッドであるためです。
self.構文を使用して、または一般的に言えば、任意のレシーバー ( の前にあるもの)を使用して Ruby のプライベート メソッドにアクセスすることはできません.。これは、保護されたメソッドでのみ可能です。