2009-05-27 13 views
8

以下の例では、as stated elsewhere、kが実際に受信機である場合、 "k.receive:hello"の代わりに "k.send:hello"と言うのはなぜですか?それ"k.send:hello" - kが "受信者"の場合、誰が送信者ですか?

がkのようなが送信者ではなく、受信側で聞こえます。

送信者が「k.send:hello」と言うとき、kでない場合は? Smalltalkので

(あなたは私と同じ混乱していますか?)

class Klass 
    def hello 
    "Hello!" 
    end 
end 
k = Klass.new 
k.send :hello #=> "Hello" 
k.hello   #=> "Hello" 

答えて

6

このコードを含むオブジェクトはすべて、メッセージを送信しています(おそらくmain)。より明示的なオブジェクトと通常のメッセージ・パッシングでそれを見てみましょう。このコードの最後の行で

class Person 
    attr_accessor :first_name, :last_name 
    def initialize(first_name, last_name) 
    @first_name, @last_name = first_name, last_name 
    end 
    def marry(other) 
    self.last_name = other.last_name 
    end 
end 

bob = Person.new('Bob', 'Smith') 
patty = Person.new('Patricia', 'Johnson') 

patty.marry bob 

、メインはパテにmarryを送信していますが、ひいてはパテはlast_name=自分自身を送信し、ボブlast_nameを送信します。

+0

「パティは自分自身と結婚しています」よりも、「メインはパティと結婚しています」をどのように知っていますか? – lorz

+1

パティは私たちのメッセージに応じて結婚方法を実行しています。結婚の方法を削除してmethod_missingを実装することができました。結婚の方法がもはやなくなっても、私たちは依然としてメッセージを見て、返答することができます。 – Chuck

+0

申し訳ありませんが、私は理解が遅いです。私はまだあなたの最後の点がメインがパテではなくメッセージの起源であることを示している理由は分かりません。 – lorz

7

、すべてが対象です。 「送信者」は、メッセージが発信されたスコープの所有者であるオブジェクト(つまり「this」または「self」ポインタ)です。

以前と同じように、Rubyはこの概念を継承しています。あまり抽象的な言葉では、私はあなたに手紙を掲示すれば、私は "送付者"(それは私のオフィスから来た)であり、あなたは "受信者"です(正面のアドレスはあなたです)。だから、私はfoo.send myLetterを書いています。あなた、fooは、私の手紙を受け取ります。送信者は暗黙のうちに、コードの所有者が「投稿」しています。

+0

Hmmm。これについてはまだ本当に混乱しています。私はJavaから来ています。だから私はオブジェクトのメソッドを呼び出す。それはこの送受信とは異なるのでしょうか、まったく異なる用語ですか? – lorz

+0

それはちょっと違う用語です: "call"の場合、 "send message"を読んでください。 "私は呼ばれました"のために、 "私は受信機です"とお読みください –

+1

それは単なる異なる用語ではありません。対応する方法のないメッセージを送信することができます。存在しないメソッドを呼び出すことはできません。 – Chuck

2

私はあなたが混乱しているところを見ることができますが、その問題は大きく意味があります。あなたの引数はsend方法が本当に、receiveでなければならないことであるメッセージを受信kある以来(すなわち、k.receive :hello)。普通の英語では、 "kはメッセージに 'hello'を送信するのではなく、" hello "(誰に?)"というメッセージを送信する "k.send :helloと読んでいます。 、メッセージに応答しないことがありますkkはそれを無視することもできます -

一つ方法は、「受信」の名前に変更することもでき、それはkないメッセージを受け取る可能性があるため、また、誤った名称のビットですまたはkはそれを別のオブジェクトに渡すことを選択できます。 Ruby(そしてRubyに影響を与えたSmalltalk)では、メソッドはのように、のコマンドではなく、というコマンドを実行するのではなく、何かを行うように要求しています。

+1

はい、あなたは私の意味論的な混乱を理解しています。しかし、私はあなたのことを理解していません - "kはメッセージを受け取らないかもしれません - kはメッセージに応答しないかもしれません、kはそれを無視するか、またはkが別のオブジェクトにそれを渡すことを選ぶかもしれません"どのようにkはメッセージを無視する? – lorz

+1

Smalltalkでは、まったく同じメソッドがperform:と呼ばれていますが、これはもっと良い名前だと思います。 – Chuck

+0

@ lorz:いくつかの理由があります:kは 'hello'メソッドを実装していないか、実装で何もしないことを選択することがあります。メッセージを別のオブジェクトに渡すこともできます。 「無視する」という私の選択は貧弱である可能性があります(たとえば、Javaでは、単純に何もしないメソッド実装が可能です)。 @チャック:私は同意します。私は、CocoaフレームワークはperformSelectorという名前を使用すると思います。 – mipadi

関連する問題