23 lines
		
	
	
		
			555 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			23 lines
		
	
	
		
			555 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class Hash
 | |
|   def deep_merge(other_hash, &block)
 | |
|     dup.deep_merge!(other_hash, &block)
 | |
|   end
 | |
| 
 | |
|   def deep_merge!(other_hash, &block)
 | |
|     other_hash.each_pair do |current_key, other_value|
 | |
|       this_value = self[current_key]
 | |
| 
 | |
|       self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
 | |
|         this_value.deep_merge(other_value, &block)
 | |
|       else
 | |
|         if block_given? && key?(current_key)
 | |
|           block.call(current_key, this_value, other_value)
 | |
|         else
 | |
|           other_value
 | |
|         end
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     self
 | |
|   end
 | |
| end | 
