首页 > 解决方案 > 有没有更短的方法来编写这种哈希合并?

问题描述

我有两个哈希。第一个哈希应该优先。nil只有当它是或空白时,它才应该被第二个哈希覆盖。

main_hash.merge!(option_hash) do |key, main_hash, option_hash|
  main_hash.presence || option_hash.presence
end

标签: ruby-on-railsruby

解决方案


使用您的代码,这很好,但对块和较短的块变量使用花括号。你不需要第二个presence

main_hash.merge!(option_hash){|_k, h1, h2| h1.presence || h2}

#merge!(and #merge) with a block 仅调用该块来处理两个哈希中都存在键的情况。在option_hash中不存在键的情况main_hash下,只需插入键/值对。

您可以使用#merge!with 块来做一些巧妙的技巧,例如设置哈希值的组合总数。

hash_1 = {a: 1, b: 1, c: 1}
hash_2 = {b: 1, c: 1, d: 1}

hash_1.merge!(hash_2{|_k, v1, v2| v1 + v2}
=> {:a => 1, :b => 2, :c => 2, :d => 1}

推荐阅读