13

私は Ruby の本を読んでいて、疑似変数 self の次の定義に出くわしました。

self - 現在のメソッドの受信側オブジェクト

誰かがその定義を分解し、それが何を意味するかを説明できますか? 私はそれを理解していません。

編集:私は実際に自己(およびそのアプリケーション)が何であるかについてかなり良い考えを持っており、Googleで検索する方法を知っています. 誰かが私が引用した定義を説明できるかどうか疑問に思っていました. それは具体的に。

4

3 に答える 3

22

Ruby やその他の言語 (Smalltalk や Objective-C など) では「メッセージ パッシング」という用語が好まれますが、Java や C++ では「メソッド呼び出し」が好まれます。つまり、「Java の方法」はオブジェクトのメソッドを呼び出すこと (オブジェクトのコンテキストでコードを実行すること) であるのに対し、「Ruby の方法」はオブジェクトにメッセージを送信することであり、オブジェクトはそのメソッドを実行することによって応答します。

Ruby はこの行my_string.lengthを「メッセージを送信my_stringする」と表現します。lengthmy_stringメッセージを受信するため、レシーバーと呼ばれます。lengthメソッドの定義内では、selfを参照しmy_stringます。と同じ効果が得られmy_string.send(:length)ます。

メッセージ パッシングの観点からこの概念を考えると、メソッド呼び出しの観点から考えるよりも柔軟です。オブジェクトでメソッドを呼び出すには、そのメソッドが事前に定義されている必要がありますが、動的に処理することを選択できるメッセージをオブジェクトに送信できます ( とrespond_to?を使用method_missing)。この柔軟性は、Ruby を簡潔なドメイン固有言語 (DSL) として使用できるようにする 1 つの側面です。

于 2009-05-17T09:06:18.470 に答える
14

selfコンテキストに応じて変化する特別な変数です。具体的には、おっしゃる通り、現在のメソッドのレシーバーオブジェクトです。これを理解するには、レシーバーの意味を理解する必要があります。

Ruby のプログラミング:メソッドクラスとオブジェクトの詳細を参照してください。

レシーバー、メソッドの名前、およびオプションでいくつかのパラメーターと関連ブロックを指定して、メソッドを呼び出します。

connection.downloadMP3("jitterbug") { |p| showProgress(p) }

この例では、オブジェクトconnection はレシーバー、downloadMP3はメソッドの名前、"jitterbug"はパラメーター、中括弧の間は関連するブロックです。

foo = "hello"
bar = foo.dup
class <<foo
  def to_s
    "The value is '#{self}'"
  end
  def twoTimes
    self + self
  end
end

foo.to_s        »   "The value is 'hello'"
foo.twoTimes    »   "hellohello"
bar.to_s        »   "hello"

ではfoo.twoTimesfoopart はメソッド呼び出しのレシーバーと呼ばれます。したがって、twoTimesメソッド内では、コンテキスト内selfのオブジェクトを参照しfooます。

ここにも非常に良い説明があります

于 2009-05-17T04:35:50.650 に答える
4

self - 現在のメソッドの受信側オブジェクト

Ruby での「メソッド呼び出し」は、メッセージ送信メカニズムによって実現されます。そう

some_object.some_method(args)

の省略形です

some_object.send(:some_method, args)

これが引用の意味だと思います。「自己」は、メッセージ (またはメソッド) の送信先のオブジェクト、つまり現在のメソッドの受信者です。

メッセージ送信全体が、Ruby を非常に動的にするものの一部です。これにより、オブジェクトがmethod_missing現在処理していないメッセージを簡単に定義し、それらをどう処理するかを決定できます。Rails はこれをよく使用します。たとえば、ActiveRecord には「find_by...」構文があり、呼び出された/送信されたメソッドの名前から必要なものを割り出します。

于 2009-05-17T09:07:32.103 に答える