railsがんばる子

Ruby on Railsがんばる子です。胡蝶蘭のECサイトを運営しています。

mapでrecieverを破壊するパターン

mapは新しく集合を作るメソッドだが、ブロック引数を操作するとレシーバーを破壊する

[8] pry(main)> al = [{k: 'initial_1'}, {k: 'initial_2'}]
=> [{:k=>"initial_1"}, {:k=>"initial_2"}]

# 元のデータを破壊していない
[9] pry(main)> al.map{|e|e[:k]='modified'}
=> ["modified", "modified"]

[10] pry(main)> al.map do |e|e[:k]='modified'
[10] pry(main)*   e
[10] pry(main)* end  
=> [{:k=>"modified"}, {:k=>"modified"}]

# 元のデータが破壊されている!!
[11] pry(main)> al
=> [{:k=>"modified"}, {:k=>"modified"}]

mapは新しい集合を作る関数だが、ブロック引数の変更は副作用があるようだ。