Rubyでの送信者と受信者の実際の意味を理解するのは難しいと思います。それらは一般的にどういう意味ですか?これまでのところ、私はそれらをメソッド呼び出しとその戻り値を受け取るものとして単純に理解しています。しかし、私の理解は十分とは言えません。Rubyの送信者と受信者について具体的に説明してもらえますか?
6 に答える
オブジェクト指向のコアコンセプトは、メッセージングと初期の概念化であり、計算のアクターモデルから多くを借りています。オブジェクト指向という用語を作り出し、最初のオブジェクト指向言語の1つであるSmallTalkを発明したアラン・ケイは、メッセージではなくオブジェクトに焦点を当てた用語を使用したことに後悔を表明しました。
メッセージについて話すとき、メッセージの自然な「送信者」と「受信者」があります。送信者はメソッドを呼び出すオブジェクトであり、受信者はメソッドが呼び出されるオブジェクトです。Rubyでは、オブジェクトに明示的に名前を付けずにメソッドを呼び出すと、メソッド名とその引数がメッセージとしてデフォルトの受信者に送信されますself
。
OOでは、「呼び出しを行う」、「メソッドを呼び出す」、および「メッセージを送信する」は同等の概念です。同様に、「呼び出される」、「メソッドが呼び出される」、「メッセージを受信する」は同等です。
Rubyプログラムを作成し、文字列にそれ自体を反転するように指示すると、あなたが送信者になり、文字列オブジェクトが受信者になります。例えば、
"this is a string".reverse
"this is a string".send(:reverse) # equivalent
コーダーとしてあなたがしていることは、メッセージを送信することです:そのメッセージの受信者であるその文字列オブジェクトに逆に、出力は次のようになります
=> "gnirts a si siht"
これは戻り値です。
送信するメッセージをオブジェクトが処理できるかどうかを照会できます。
"this is a string".respond_to?(:reverse)
=> true
Hash.new.respond_to?(:reverse)
=> false
これは、irbでのプレイからの最も単純な例です。Twitterなどの他のAPIと相互作用する可能性のある複雑なプログラムを作成する場合(一般的な例を挙げます)、「このハッシュタグを含むすべてのツイートを取得する」などのメッセージを送信できるクライアントオブジェクトをインスタンス化します。
"1234" .reverse
- メッセージは「reverse」であり、reverseと呼ばれるメソッドに対応している必要があります。言い換えれば、この方法は「メッセージ」であると考えることができます。
- 受信者は文字列オブジェクト「1234」です
- 送信者は、メソッドが呼び出されるオブジェクトです。この場合、それは(あるべき自己)メインでなければなりません。
私の推測では、あなたは「発信者」と「送信者」を混同していると思います。この文脈で「送信者」が何であるかはわかりません。
メソッドには、次のメソッドを埋め込むことができます。
def foo argument
object.bar(argument)
end
上記の場合、foo
はの呼び出し元ですbar
。object
の受信者ですbar
。
これらの用語は、Smalltalkで教えられているオブジェクト指向の基本的な概念に由来しています。覚えておいてください:すべてがオブジェクトです。オブジェクトが相互作用できる唯一の方法は、互いにメッセージを送信することです。
便利な言い方obj.do_somthing
は、実際、現在self
送信しているメッセージ「hey obj、pleasedo_something」です。objのdo_somethingメソッドの戻り値は、そのメッセージに対する答えと見なすことができます。
class A
def foo(obj)
obj.send(:object_id)
end
end
a = A.new
b = Object.new
a.foo(b)
=> 4232
この例a
では、「送信者」とb
「受信者」です。