如果我要递归合并2个哈希,我可以用下面的函数这样做:扩展Ruby类(散)的新功能(recursive_merge)
def recursive_merge(a,b)
a.merge(b) {|key,a_item,b_item| recursive_merge(a_item,b_item) }
end
这个伟大的工程,因为我现在可以做:
aHash = recursive_merge(aHash,newHash)
但我想补充一点,这是一种类似于merge!
类似的自我更新风格的方法。我可以添加在返回函数:
class Hash
def recursive_merge(newHash)
self.merge { |key,a_item,b_item| a_item.recursive_merge(b_item) }
end
end
,但我不知道如何重新创建bang
功能,如果没有关联更新原始对象。
class Hash
def recursive_merge!(newHash)
self.merge { |key,a_item,b_item| a_item.recursive_merge(b_item) }
# How do I set "self" to this new hash?
end
end
编辑例如按照意见。
h={:a=>{:b => "1"}
h.recursive_merge!({:a=>{:c=>"2"})
=> {:a=>{:b=>"1", :c="2"}}
在:b=>"1"
定期合并结果通过:c="2"
你试过'self.merge! {| key,a_item,b_item | a_item.recursive_merge!(b_item)}' –
如果您给出了一些散列示例和预期结果,它可以帮助我们。默认情况下'merge'会用相同的键代替值,除非你打算做一些不同的事情,块/递归方法可能没有意义? – Anthony
我猜测他的意思是,如果这些值是散列值,那么递归地合并这些值,而不是简单地将其中一个覆盖。 –