kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

Hash#reverse_mergeとHash#reverse_merge!

タイトルのClass#Methodをransack gemで見かけたので、調べてみました。

ActiveSupport::CoreExtensions::Hash::ReverseMergeのソースは下記になります。 https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/reverse_merge.rb

一部抜粋していくと

 other_hash.merge(self)

こんだけです。 !付きのは下記の通りです。

options 
=> { name: 'ikeda', age: 29 }
self
=> { name: 'kazuyuki', programmer: true }
options.merge!( other_hash ){ |key,left,right|, left }
=> { name: 'ikeda', age: 29, programmer: true }

あと、alias reverse_update, rever_merge!としています。 これはHash#merge!,Hash#updateでも同様ですね。

これにより何が期待できるかというと(開発者の意図はしりませんが)

{ name: 'ikeda', age: 29 }.merge(options)
options.reverse_merge({ name: 'ikeda', age: 29 })

optionsのメソッドを利用して,optionsの値を優先でmergeできます。

オブジェクトと引数を逆にするほうが直感的だったんでしょうね。