From: Sinichiro Dezawa Date: 1996-12-27T09:23:29+09:00 Subject: [ruby-list:1534] Re: C++¥桼¥¶ ¤Τ¿¤á¤μê°ú (Ver. 0.1.1) 出沢です そういう不幸な環境にいるので、頭は C でも C++ でもないので 確認です。 標準的な C(++)? なひとは 「参照渡し」ときいて、 「その値を変えると呼出元の実引数も変わる」と理解できるでしょうか? 私の場合は「値渡しでなく参照渡しです」と並べてもらうと、 ああ、Fortran ね、ってわかるのですが、「参照渡し」とだけ 聞くとしばらく考えないと染み込んで来ません。 fortranな人は アドレス渡し、C な人はポインタを渡し と聞いた方が 直観的かな とおもいます。どうでしょう。 > > rubyには値渡ししかなく引き数として与えられた変 > > 数の値を変えても元の式の値は変わりません.ただし,オブジェク > > トの参照が渡るので値に対して破壊的な操作は可能です. > > この言葉は全く正しいのですが(作者の言葉なんだから当たり前 > だ^^;)、ちょっと読むと、前半で「値渡ししかなく」と言いなが > ら後半「参照が渡る」と反対の事を言っている様にみえて、かな > り難しいですね。 そう。悩んだ。 「オブジェクトを値渡し」と聞くと(Cみたいな言語での、perlかな) 「配列を値渡し」と同じように感じて、プロパティも全部copyされて 渡される様に感じてしまった。 オブジェクト は 実装としては(まだ見て無いけど多分 structerで、 method や propaty はそこからpointer または pointer のlist で 参照されてるのですよね。 で、 値渡し というのは この structer 部分だけ copy される。 データの実体である pointer 部分の値もそのまま。 pointer の指してる実体を触ると元の方にも影響する。 だから 値渡し で 参照が渡る。 とここまで判るのに一風呂。 > ことは出来ない」と言えますが、ruby の様な超高級言語で、物 > 理的なモデルを援用して解説するのもナンでしょう。 同感なんですが、『C++ユーザのための手引』は ruby が第二外国語(英語の次)って人向けでなく、CとかC++とかの 人に向けた C++ユーザのための手引だから 「C++語で説明するなら」 ということで ポインタ とか使った説明で許されるのでは、、、、 > 最初にハマッタのは、 私もまず配列ではまりました。 で次に def foo(b) b = "B" もしくは 3 end a = "A" もしくは 2 print a, "\n" # => A もしくは 2 foo(a) print a, "\n" # => A もしくは 2 あれ? 配列 と 整数や文字列は挙動が違う ってますますはまった。 ここでやっと 構造 の参照渡し、主varue もポインタで参照 って気付いた。 型無し何だからあたりまえなんだけど。 仮引数に渡されたオブジェクトへの操作により実引数のオブジェクトも操作される 変数に代入されたオブジェクトへの操作によりもとののオブジェクトも操作される 仮引数への別のオブジェクトの代入は、実引数に影響しない。 変数に別のオブジェクトを代入してもは、もとのオブジェクトには影響しない。 んー。事実だけ書いてもなんのこっちゃ? って判ってもらえないだろうな。 ここ結構はまるんじゃないかと思う。そうなら 重要だ。 > 結局、オブジェクトとオブジェクトの参照の区別をきちんとつけた > 上で、 んー? だって 我々が目で見れるのはすべて オブジェクトの参照 でしょ? ”ABC”とか 2.4 とかの 定数 としての オブジェクト以外は。 a=Array.new てしても a は既に Arrayのオブジェクト の参照だよね。