私は Ruby の本を読んでいて、疑似変数 self の次の定義に出くわしました。
self - 現在のメソッドの受信側オブジェクト
誰かがその定義を分解し、それが何を意味するかを説明できますか? 私はそれを理解していません。
編集:私は実際に自己(およびそのアプリケーション)が何であるかについてかなり良い考えを持っており、Googleで検索する方法を知っています. 誰かが私が引用した定義を説明できるかどうか疑問に思っていました. それは具体的に。
Ruby やその他の言語 (Smalltalk や Objective-C など) では「メッセージ パッシング」という用語が好まれますが、Java や C++ では「メソッド呼び出し」が好まれます。つまり、「Java の方法」はオブジェクトのメソッドを呼び出すこと (オブジェクトのコンテキストでコードを実行すること) であるのに対し、「Ruby の方法」はオブジェクトにメッセージを送信することであり、オブジェクトはそのメソッドを実行することによって応答します。
Ruby はこの行my_string.length
を「メッセージを送信my_string
する」と表現します。length
はmy_string
メッセージを受信するため、レシーバーと呼ばれます。length
メソッドの定義内では、self
を参照しmy_string
ます。と同じ効果が得られmy_string.send(:length)
ます。
メッセージ パッシングの観点からこの概念を考えると、メソッド呼び出しの観点から考えるよりも柔軟です。オブジェクトでメソッドを呼び出すには、そのメソッドが事前に定義されている必要がありますが、動的に処理することを選択できるメッセージをオブジェクトに送信できます ( とrespond_to?
を使用method_missing
)。この柔軟性は、Ruby を簡潔なドメイン固有言語 (DSL) として使用できるようにする 1 つの側面です。
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.twoTimes
、foo
part はメソッド呼び出しのレシーバーと呼ばれます。したがって、twoTimes
メソッド内では、コンテキスト内self
のオブジェクトを参照しfoo
ます。
self - 現在のメソッドの受信側オブジェクト
Ruby での「メソッド呼び出し」は、メッセージ送信メカニズムによって実現されます。そう
some_object.some_method(args)
の省略形です
some_object.send(:some_method, args)
これが引用の意味だと思います。「自己」は、メッセージ (またはメソッド) の送信先のオブジェクト、つまり現在のメソッドの受信者です。
メッセージ送信全体が、Ruby を非常に動的にするものの一部です。これにより、オブジェクトがmethod_missing
現在処理していないメッセージを簡単に定義し、それらをどう処理するかを決定できます。Rails はこれをよく使用します。たとえば、ActiveRecord には「find_by...」構文があり、呼び出された/送信されたメソッドの名前から必要なものを割り出します。