2010年
8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

セットアップ日記


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の変数はすべて参照で、メソッドではその参照が値渡しされるということだろうか。
[]