Module: ActiveSupport::DeepMergeable
Do not use. This module is for internal use only.
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
Defined in: | activesupport/lib/active_support/deep_mergeable.rb |
Overview
Provides #deep_merge and #deep_merge! methods. Expects the including class to provide a merge!(other, &block)
method.
Instance Method Summary
-
#deep_merge(other, &block)
Returns a new instance with the values from
other
merged recursively. -
#deep_merge!(other, &block)
Same as #deep_merge, but modifies
self
. -
#deep_merge?(other) ⇒ Boolean
Returns true if
other
can be deep merged intoself
.
Instance Method Details
#deep_merge(other, &block)
Returns a new instance with the values from other
merged recursively.
class Hash
include ActiveSupport::DeepMergeable
end
hash_1 = { a: true, b: { c: [1, 2, 3] } }
hash_2 = { a: false, b: { x: [3, 4, 5] } }
hash_1.deep_merge(hash_2)
# => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }
A block can be provided to merge non-DeepMergeable
values:
hash_1 = { a: 100, b: 200, c: { c1: 100 } }
hash_2 = { b: 250, c: { c1: 200 } }
hash_1.deep_merge(hash_2) do |key, this_val, other_val|
this_val + other_val
end
# => { a: 100, b: 450, c: { c1: 300 } }
# File 'activesupport/lib/active_support/deep_mergeable.rb', line 29
def deep_merge(other, &block) dup.deep_merge!(other, &block) end
#deep_merge!(other, &block)
Same as #deep_merge, but modifies self
.
# File 'activesupport/lib/active_support/deep_mergeable.rb', line 34
def deep_merge!(other, &block) merge!(other) do |key, this_val, other_val| if this_val.is_a?(DeepMergeable) && this_val.deep_merge?(other_val) this_val.deep_merge(other_val, &block) elsif block_given? block.call(key, this_val, other_val) else other_val end end end
#deep_merge?(other) ⇒ Boolean
Returns true if other
can be deep merged into self
. Classes may override this method to restrict or expand the domain of deep mergeable values. Defaults to checking that other
is of type self.class
.
# File 'activesupport/lib/active_support/deep_mergeable.rb', line 49
def deep_merge?(other) other.is_a?(self.class) end