From: Tetsuo Sakaguchi Date: 2007-02-01T20:52:03+09:00 Subject: [ruby-list:43153] Re: 配列は、メソッド呼出における引数初期化の例外なんでしょうか? 阪口と申します。このmlには初投稿ですが、よろしくお願いします。 In message <45C1C054.5060407@masou.net> 2007-02-01T19:26+0900, Masou wrote: > 文字列は初期化されますが、Arrayは初期化されず、 > 書換えた結果が呼び出し元に返されてます。 初期化されるされないではなく、 変数への代入は各変数の有効範囲内のみで有効でしかないのですが、 複数の変数が同じオブジェクトを参照しているとそのオブジェクトの 状態変化は、どの変数から見ても共通に見えるということです。 つまり、 > def henkan(ary, str) > p [21, str, ary] > ary.shift > str = "new" > p [22, str, ary] > end この ary.shift は「aryという変数から参照されている配列オブジェクトに shift して状態を変えなさい」と指示しているので、配列自体が変わる。 一方、str = "new"は「strという変数に今まで参照していた値を忘れて、 "new"という文字列を参照しなさい」と指示したことになります。 で、ここの変数str, ary はこのメソッド内だけで有効です。 で、この変数aryが参照しているのは、 > str = "old"; ary = ["(", "{"] で代入された「["(", "{"]」という配列オブジェクトで、同じオブジェクトを 参照しているので、メソッドから戻ってもそのオブジェクトはshiftされたもの ということですね。 一方、こちらのstrにはこの行以降代入を指示していないので、依然として"old"を 指し示しているということです。 この辺のポイントは「call by value(引数の値渡し)」と 「配列もオブジェクトである」という点ですね。 PS. つい説明が長くなりました。既にこの辺をご存知の方にはご容赦を。 -- 阪口哲男@図書館情報メディア研究科.大学院.筑波大学 Tetsuo SAKAGUCHI. Graduate School of Library, Information and Media Studies University of Tsukuba, JAPAN.