rubyのeachメソッドについて少し調べてみた
結論を先に述べるとよくわからなかったです。 とりあえず、調べた内容を残しておきました。
hoge = [{0=> 'aaaa'}, {1=> 'bbb'}, {2=> 'ccc'}] hoge.each.with_index do |a, index| p a.object_id, hoge[index].object_id end p hoge
69822855751840 69822855751840 69822855751800 69822855751800 69822855751760 69822855751760 [{0=>"aaaa"}, {1=>"bbb"}, {2=>"ccc"}]
こう見ると、a.object_id, hoge[index].object_idは同じオブジェクトのように見える。
hoge.each.with_index do |a, index| a = {(index) => 'ddddddd'} end p hoge
[{0=>"aaaa"}, {1=>"bbb"}, {2=>"ccc"}]
hoge.each.with_index do |a, index| a[index] = 'ddddddd' end p hoge
[{0=>"ddddddd"}, {1=>"ddddddd"}, {2=>"ddddddd"}]
↑2つの挙動は同じだと思うのだが、実際は違う・・・ 謎だ・・・
[{0=>{}}, {1=>{}}, {2=>{}}]
hoge.each.with_index do |a, index| p a, index, hoge hoge.delete a end p hoge
{0=>{}} 0 [{0=>{}}, {1=>{}}, {2=>{}}] {2=>{}} 1 [{1=>{}}, {2=>{}}] [{1=>{}}]
deleteメソッドを使うとこの用にレシーバを書き変えることが出来た。