原です。

In message "[ruby-list:18419]
    on 99/11/05, Wakou Aoyama <wakou / fsinet.or.jp> 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(++) ユーザへの説明のスタンダードになるわけです。