我有两个哈希。第一个哈希应该优先。nil只有当它是或空白时,它才应该被第二个哈希覆盖。
main_hash.merge!(option_hash) do |key, main_hash, option_hash|
main_hash.presence || option_hash.presence
end
我有两个哈希。第一个哈希应该优先。nil只有当它是或空白时,它才应该被第二个哈希覆盖。
main_hash.merge!(option_hash) do |key, main_hash, option_hash|
main_hash.presence || option_hash.presence
end
使用您的代码,这很好,但对块和较短的块变量使用花括号。你不需要第二个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}
这更短,但我认为你的方式更具可读性。
main_hash = {a:1, b:nil, c:3}
option_hash = {a:5, b:2, c:8}
main_hash = option_hash.merge(main_hash.reject{|_,v| v.blank?})
#=> {a:1, b:2, c:3}
您可以这样做,并为结果提供一个变量名称,使正在发生的事情更清晰,merged_main_option_hash而不仅仅是main_hash
[1] pry(main)> main_hash = { key1: 1, key2: 2, key3: '', key4: nil }
=> {:key1=>1, :key2=>2, :key3=>"", :key4=>nil}
[2] pry(main)> option_hash = { key2: 2.2, key3: 3, key4: 4 }
=> {:key2=>2.2, :key3=>3, :key4=>4}
[3] pry(main)> main_hash.reject!{ |key, value| value.blank? }.merge!(option_hash) { |key, main_hash_value, option_hash_value| main_hash_value }
=> {:key1=>1, :key2=>2, :key3=>3, :key4=>4}
[4] pry(main)>
参考apidock:合并!, apidock: 拒绝! 更多细节。