5

オブジェクト指向言語としての Ruby。つまり、送信するメッセージは何であれ、クラスのオブジェクト/インスタンスで厳密に送信します。

例:

 class Test
   def test1
    puts "I am in test1. A public method"
    self.test2
   end

   def test2
    puts "I am in test2. A public Method"
   end
 end

オブジェクトのメソッドtest2を呼び出すのは理にかなっていますself

しかし、私はこれを行うことはできません

  class Test
   def test1
    puts "I am in test1. A public method"
    self.test2 # Don't work
    test2 # works. (where is the object that I am calling this method on?)
   end

   private
   def test2
    puts "I am in test2. A private Method"
   end
 end

いつそれを呼び出すことができますかtest2(公平に言えば、自己オブジェクトに送信されるメソッド)。しかし、いつ私はそれを自分で呼び出すことができません。では、メソッドを送信しているオブジェクトはどこにあるのでしょうか?public methodselftest2private method

4

4 に答える 4

11

問題

Rubyでは、プライベートメソッドを明示的なレシーバーで直接呼び出すことはできません。ここでは自己は特別な扱いを受けません。定義上、呼び出すself.some_methodときは明示的な受信者として自分自身を指定しているので、Rubyは「いいえ」と言います。

ソリューション

Rubyには、メソッドルックアップのルールがあります。ルールにはもっと正規のソースがあるかもしれませんが(Rubyソースに行く以外)、このブログ投稿ではルールを一番上に示しています。

1) Methods defined in the object’s singleton class (i.e. the object itself)
2) Modules mixed into the singleton class in reverse order of inclusion
3) Methods defined by the object’s class
4) Modules included into the object’s class in reverse order of inclusion
5) Methods defined by the object’s superclass, i.e. inherited methods

言い換えると、プライベートメソッドは、明示的なレシーバーを必要としない(または許可しない)ときに、最初に自分で検索されます。

于 2012-05-30T08:21:12.220 に答える
5

メソッドを送信しているオブジェクトはどこですか

ですself。レシーバーを指定しない場合、レシーバーはselfです。

Ruby での の定義でprivateは、プライベート メソッドはレシーバーなしでのみ呼び出すことができます。つまり、 の暗黙的なレシーバーが必要selfです。puts興味深いことに、プライベート インスタンス メソッドでもあるメソッドではまったく気にしませんでした;-)

注: この規則には例外があります。プライベート セッターは、レシーバーが である限り、明示的なレシーバーで呼び出すことができselfます。実際には、明示的なレシーバーで呼び出す必要があります。そうしないと、ローカル変数の割り当てがあいまいになるためです。

foo = :fortytwo      # local variable
self.foo = :fortytwo # setter
于 2012-05-30T10:34:44.050 に答える
2

selfあなたがいるオブジェクトの現在のインスタンスを意味します。

class Test
  def test1
    self
  end
end

を呼び出すTest.new.test1と、 のようなものが返されます#<Test:0x007fca9a8d7928>
これは、現在使用している Test オブジェクトのインスタンスです。

メソッドをプライベートとして定義することは、現在のオブジェクトでのみ使用できることを意味します。
を使用する場合self.test2、現在のオブジェクトの外に出て (インスタンスを取得)、メソッドを呼び出します。
したがって、オブジェクトにいないかのようにプライベートメソッドを呼び出しているため、できません。

を指定しないselfと、現在のオブジェクト内にとどまります。
したがって、メソッドを呼び出すだけです。test2Ruby はそれがメソッドであって変数ではないことを認識し、呼び出すことができるほど賢いです。

于 2012-05-30T07:46:43.873 に答える