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

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

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