self
Ruby では、これがベア メソッド呼び出しの暗黙のレシーバーであると理解しています。でも:
~: irb
>> puts "foo"
foo
=> nil
>> self.puts "foo"
NoMethodError: private method `puts' called for main:Object
これを説明するものは何ですか?
それが助けになる場合:
>> method(:puts).owner
=> Kernel
self
Ruby では、これがベア メソッド呼び出しの暗黙のレシーバーであると理解しています。でも:
~: 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 のプライベート メソッドにアクセスすることはできません.
。これは、保護されたメソッドでのみ可能です。