如何合并两个散列而不覆盖Ruby中的重复键?

有没有简单或优雅的方式来合并两个散列而不覆盖重复键?

也就是说,如果密钥存在于原始哈希中,我不想改变它的值。

如果您有两个哈希值, optionsdefaults ,并且想要将defaults合并到options而不覆盖现有的键,那么您真正想做的是相反的:合并optionsdefaults

 options = defaults.merge(options) 

或者,如果您使用Rails,则可以执行以下操作:

 options.reverse_merge!(defaults) 

标准Ruby库有一种合并Hashes而不覆盖现有值或重新分配散列值的方法。

 important_hash.merge!(defaults) { |key, important, default| important } 

如果你的问题是原来的哈希和第二个哈希都可能有重复的键,你不想在任何方向覆盖,你可能不得不去做一个简单的手动合并与某种碰撞检查和处理:

 hash2.each_key do |key| if ( hash1.has_key?(key) ) hash1[ "hash2-originated-#{key}" ] = hash2[key] else hash1[key]=hash2[key] end end 

显然,这是非常基本的,并假设hash1没有任何键称为“hash2-originated-whatever” – 你可能会更好的只是添加一个数字的关键,所以它成为key1,key2等等,直到你点击一个不在hash1中的。 另外,我还没有做几个月的ruby,所以这可能不是语法上的正确,但你应该能够得到的主意。

也可以将键的值重新定义为数组,以便hash1 [key]从hash1返回原始值,从hash2返回值。 取决于你希望你的结果是真的。