Javaの「呼び出し元」はRubyの「受信者」と同じですか?
x.hello()
Javaでは、オブジェクトxはそれに含まれるメソッドを「呼び出している」。
Rubyでは、オブジェクトxはそれに含まれるメソッドを「受け取っています」。
同じアイデアを表現するためのこれとはちょっと違う用語か、イデオロギーに根本的な違いがありますか?
Javaから来る私はRubyの "受信機"のアイデアがかなり困惑していることがわかります。おそらく誰かがこれをJavaに関して説明できますか?
Javaの「呼び出し元」はRubyの「受信者」と同じですか?
x.hello()
Javaでは、オブジェクトxはそれに含まれるメソッドを「呼び出している」。
Rubyでは、オブジェクトxはそれに含まれるメソッドを「受け取っています」。
同じアイデアを表現するためのこれとはちょっと違う用語か、イデオロギーに根本的な違いがありますか?
Javaから来る私はRubyの "受信機"のアイデアがかなり困惑していることがわかります。おそらく誰かがこれをJavaに関して説明できますか?
例では、x
はではなく、hello()
となります。そのスニペットを含むオブジェクトには「呼び出し」(つまり、「呼び出し元」)があります。 Javaでは、x
は受信機と呼ばれることがあります。 hello()
メソッドへの呼び出しを受信しています。
私が間違っていると誰かが私を修正しますが、これらの用語をJavaに適用することはできません。 RubyはSmalltalkから来ており、メッセージ(メソッドではない)を使ってオブジェクト間の通信を行います。技術的には、RubyでmyObj.to_s
を実行すると、メッセージがmyObj
に送信されており、それに応じてそのメッセージが処理されています。このモデルでは、myObj
が実際このメッセージの受信者であり、メッセージが送信された行を所有するクラスが送信者です。
Javaでは、これは存在しません。メソッドを呼び出すオブジェクトがあります。送信者と受信者はありません。あなたがイデオロギーに根本的な違いがあると言ったとき、あなたは正しいことを持っていました。
私の思考はあなたのものと一致していたでしょうので、私があなたに投票した人が理由を説明してくれたらと思います。 – lorz
これは単なる用語です: 'this'は受信側のポインタで、' sun.reflect.Reflection.getCallerClass'やメソッド呼び出しis_aメッセージの送信などを使って送信者(または呼び出し元)を取得できます。 –
ええと...説明がうまくいくと思うよりも、私は同意します。 –
用語の違い以上です。 Javaでは、VMは、特定のオブジェクトが送信しようとしているメッセージ(つまり、呼び出しようとしているメソッド)を「受け入れる」かどうかを判断します。オブジェクトの型スペースがそのメソッドを定義していない場合、例外がスローされ、メッセージは決して配信されません。
Rubyでは、メッセージは、常にです。オブジェクトは、それにマッチするメソッドを見つけるかもしれないし、そうでないかもしれません。後者の場合は、を投げるかもしれないし、でないかもしれません。 Railsはこの基本的な違いに基づいて構築されています。これは、Javaプラットフォーム上でRailsと同様に便利なDBベースのWebアプリケーションフレームワークがまだ存在しない理由の1つです(ただし、一部は近づいていますが)。
なぜこの機能はRailsのメリットですか? – lorz
ActiveRecordのORMの例が1つあります。あなたはデータベース行、例えば本を表すActiveRecordオブジェクトを持っています。あなたのコラムに対応するメソッドはありませんが、@ book.isbnのようなことができます。 @bookはメッセージを取得し、isbnメソッドがないことに気付き、そのデータベーステーブル内でその名前のカラムを探します。正しい名前の列が見つかると、値を返します。呼び出し元には、値を返すメソッド呼び出しのように見えます。 –
私は参照してください。そのため、method_missingは、実行時にメソッドが見つからないときにギアをシフトする機能を担います。 – lorz
私はオブジェクトxがそれに含まれているメソッドを「呼び出している」とは言いません。私はオブジェクト*のメソッド*を「呼び出す」と言っています。 (私の脳は約3/4スピードで、今日は半分の野望で走っているので、私はこれを肉体的に解くつもりはありません) –
あなたが言っていることは、エリクソンの答えと一致しています。 – lorz
そうです。私は彼に投票してくれると思う。 –