From: Shin-ichiro Hara Date: 1999-11-05T16:05:58+09:00 Subject: [ruby-list:18426] Re: ruby bug? (Re: 変数、代入) 原です。 In message "[ruby-list:18419] on 99/11/05, Wakou Aoyama writes: |青山です。 |> 参照渡しというのは、C++ での |> |> void foo(int &n) { |> n = 1; |> } |> main() { |> int n = 0; |> foo(n); // n=>1 |> } | |なるほど。C++ って、強引にアドレス(参照)を引き出して持って来られるので |すね。しかし、n を渡していると、やはり値渡しの参照引き出されというか、 |なんか違和感がありますね。 まさに「参照引き出され」というのがぴったりですね。呼び出し側 ではおなじ foo(n) で区別できなくて、関数 foo の定義によって、 値渡しだったり参照渡しだったりが決定されているわけです。 ただし「強引にアドレス(参照)を引き出して」というのは、ちょっ と違うかもしれません。(違わないかも知れない。)ここでは変数 のアドレスという概念は介在せず、とにかく変数を評価せずに渡し ているわけです。しかし実際は C++ コードを読んで C コードを吐 くプロセッサなどがあって、そこでの実装としては変数のアドレス を渡すしかないでしょうが、ま、一応、この場に限定すれば C++ プログラマーはアドレスの事は知らないとしても構わない。 ポイントは、変数を評価した値を渡すのではなく、変数をそのまま 渡すという所です。たぶん上記の foo には、foo(n+1)の様な呼び 出しはできないのではないでしょうか。n+1 は変数ではないから。 Ruby でいえば、defined? とか alias とか undef がそうですね。 alias bar baz は bar, baz を評価して得たオブジェクトではなく、bar, baz とい う変数そのものを問題にしている。 |> みたいのを言うんじゃないかしら。参照の値渡しは |> |> void foo(int *p) { |> *p = 1; |> } |> main() { |> int n = 0; |> foo(&n); // n=>1 |> } |> |> ですかね。 | |暗黙の内に引き出されるのではなく、明示的に渡しているという差だけで、こ |ちらも同じく値の参照渡しかと。 というわけで、これは参照を渡しているけど、参照渡しでなくて、値 渡しです。単なる言葉使いの問題ですが。 つまり、参照という言葉使いが2通りあるのが問題で、「参照の参照 渡し」と言った場合、前の「参照」は、ポインタ(オブジェクトのア ドレス)の事であり、後ろの「参照渡し」はとにかく変数を渡すこと です。だから「参照の参照渡し」とは、「ポインタ型変数をそのまま (シンボルとして)渡すこと」となります。 と、思います。C++ も C も全くといっていいほど使った事ないんで自 信ないですが。(^^; で、「Ruby のメソッドの引数の授受は参照の値渡しである」というの が C(++) ユーザへの説明のスタンダードになるわけです。