下級エンジニアの綴

新しく発見したことを綴っていこうと思っています。夢はでっかく上級エンジニアになることです。

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メソッドを使うとこの用にレシーバを書き変えることが出来た。

rubyソースコードまでは読めていないので、本日はここまでにさせていただきます。