如果我要遞歸合併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
我猜測他的意思是,如果這些值是散列值,那麼遞歸地合併這些值,而不是簡單地將其中一個覆蓋。 –