deep_merge 工作正常,但需要定义。
纯红宝石
class Hash
def deep_merge(h2)
merge(h2) { |_, v1, v2| v1.is_a?(Hash) && v2.is_a?(Hash) ? v1.deep_merge(v2) : v2 }
end
end
h1 = { a: 1, b: 2, d: { g: 7, h: 6 } }
h2 = { a: 1, b: 2, d: { m: 4, n: 5 } }
h1.deep_merge(h2)
# => {:a=>1, :b=>2, :d=>{:g=>7, :h=>6, :m=>4, :n=>5}}
此方法定义的优点是递归,并且可以使用任何深度的哈希(参见昨天的example)。
最后,如果您想要与示例中完全相同的输出,您需要h2.merge(h1):
h2.deep_merge(h1) #=> {:a=>1, :b=>2, :d=>{:g=>7, :h=>6, :m=>4, :n=>5}}
h1.deep_merge(h2) #=> {:a=>1, :b=>2, :d=>{:m=>4, :n=>5, :g=>7, :h=>6}}
导轨 3 和 4
Hash#deep_merge 附带Rails 3 & 4。
如果你使用Rails,在使用deep_merge之前不需要定义任何东西
如果您安装了 Rails,并且想在纯 Ruby 脚本中使用 deep_merge,您可以使用:
require 'active_support/core_ext/hash'
h1.deep_merge(h2)
#=> {:a=>1, :b=>2, :d=>{:g=>7, :h=>6, :m=>4, :n=>5}}