2010年08月11日 参照と値
_ rubyにおける参照と値
普段はあまり意識していないのだが、rubyでの参照と値の違いを考えてみた。まず、簡単な例を実行してみた。a=1; b=a; b=2; p a #1まあ、これは当然な結果だ。一方、配列を使うと少し違う結果が得られる。
a=[1]; b=a; b[0]=2; p a #[2]配列の代入では、参照が代入されていることが分かる。しかし、別の配列を代入すれば、元と同じような結果が得られる。
a=[1]; b=a; b=[2]; p a #[1]つまり、参照が代入されているので、破壊的メソッドを使うと、元の変数も変化するが、新しく別の値を代入しても、元の変数は変化しないのだ。配列は簡単な計算をするときによく使うので、注意が必要だ。配列の値自身を代入したいときには、
a=[1]; b=a.clone; b[0]=2; p a #[1]とすれば良い。しかし、これも完全ではなく、
a=[[1]]; b=a.clone; b[0][0]=2; p a #[[2]]となってしまう。行列などでは、cloneでは値の複製はできないのだ。ちなみに、rubyのメソッドはすべて値渡しらしい。もっとも、オブジェクトに破壊的なメソッドを使うと、元のオブジェクトも変化してしまうが。何だかややこしい。rubyの変数はすべて参照で、メソッドではその参照が値渡しされるということだろうか。