HashとActiveSupport::OrderedHashのmergeの挙動が異なる

HashとActiveSupport::OrderedHashのmergeの挙動が異なる。
使用しているRuby on Railsのバージョンは2.3.2。

Hash#mergeの場合

>> ha = {1 => 2, 2 => 4}
=> {1=>2, 2=>4}
>> hb = {2 => 1, 3 => 1}
=> {2=>1, 3=>1}
>> hc = ha.merge(hb) {|key, s_val, o_val| s_val + o_val}
=> {1=>2, 2=>5, 3=>1}

ActiveSupport::OrderedHash#mergeの場合

>> h1
=> #<OrderedHash {1=>2, 2=>4}>
>> h2
=> #<OrderedHash {2=>1, 3=>1}>
>> h3 = h1.merge(h2) {|key, s_val, o_val| s_val + o_val}
=> #<OrderedHash {1=>2, 2=>1, 3=>1}>

ActiveSupport::OrderedHashの場合、mergeの引数のブロックが無視されているようだ。
HashのつもりでOrderedHashを使っていたので、問題に気づくのに時間がかかった。
まさかこんな基本的なところに問題があろうとは。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください