Issue #7739 has been updated by trans (Thomas Sawyer). To condense the discussion down, would we agree to: class Hash def reverse_merge(a, b) b.merge(a) end def reverse_merge!(a, b) b.merge!(a) end def <<(pairs) merge!(Hash === pairs ? pairs : Hash[*pairs]) end def >>(pairs) reverse_merge!(Hash === pairs ? pairs : Hash[*pairs]) end alias | reverse_merge end That still leaves out an operator alias for #merge itself though. Do we need it, or is #| enough? ---------------------------------------- Feature #7739: Define Hash#| as Hash#reverse_merge in Rails https://bugs.ruby-lang.org/issues/7739#change-41249 Author: alexeymuranov (Alexey Muranov) Status: Assigned Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: core Target version: next minor =begin I suggest for to define (({Hash#|})) as (({Hash#reverse_merge})) in ((*Rails*)), in my opinion this would correspond nicely to (({Set#|})), to the logical (({#||})) and to the bitwise (({#|})): { :a => 1, :b => 2 } | { :b => 1, :c => 2 } # => { :a => 1, :b => 1, :c => 2 } =end -- http://bugs.ruby-lang.org/