Sha256: a2d8179e21f7d6290a0a5256b57a8cbb047464860db2bb02e5ad6e3fe6340b82
Contents?: true
Size: 1.63 KB
Versions: 4
Compression:
Stored size: 1.63 KB
Contents
# frozen_string_literal: true class Hash # Returns a new hash with +self+ and +other_hash+ merged recursively. # # h1 = { a: true, b: { c: [1, 2, 3] } } # h2 = { a: false, b: { x: [3, 4, 5] } } # # h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } } # # Like with Hash#merge in the standard library, a block can be provided # to merge values: # # h1 = { a: 100, b: 200, c: { c1: 100 } } # h2 = { b: 250, c: { c1: 200 } } # h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val } # # => { a: 100, b: 450, c: { c1: 300 } } def deep_merge(other_hash, &block) dup.deep_merge!(other_hash, &block) end # Same as +deep_merge+, but modifies +self+. def deep_merge!(other_hash, &block) merge!(other_hash) do |key, this_val, other_val| if this_val.is_a?(Hash) && other_val.is_a?(Hash) this_val.deep_merge(other_val, &block) elsif block_given? block.call(key, this_val, other_val) else other_val end end end # Merges the caller into +other_hash+. For example, # # options = options.reverse_merge(size: 25, velocity: 10) # # is equivalent to # # options = { size: 25, velocity: 10 }.merge(options) # # This is particularly useful for initializing an options hash # with default values. def reverse_merge(other_hash) other_hash.merge(self) end alias_method :with_defaults, :reverse_merge # Destructive +reverse_merge+. def reverse_merge!(other_hash) replace(reverse_merge(other_hash)) end alias_method :reverse_update, :reverse_merge! alias_method :with_defaults!, :reverse_merge! end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
simple_ext-0.1.3 | lib/simple_ext/hash/merge.rb |
simple_ext-0.1.2 | lib/simple_ext/hash/merge.rb |
simple_ext-0.1.1 | lib/simple_ext/hash/merge.rb |
simple_ext-0.1.0 | lib/simple_ext/hash/merge.rb |