6

selfRuby では、これがベア メソッド呼び出しの暗黙のレシーバーであると理解しています。でも:

~: 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 は常にローカル変数を作成するため、 のようなプライベート セッターを呼び出すこと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 に答える