原です。
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(++) ユーザへの説明のスタンダードになるわけです。