Есть ли более короткий способ написать это слияние хешей? - PullRequest
0 голосов
/ 27 марта 2019

У меня есть два хэша. Первый хэш должен быть приоритетным. Он должен быть перезаписан вторым хэшем, только если он nil или пуст.

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

Ответы [ 3 ]

2 голосов
/ 27 марта 2019

Используйте ваш код, что нормально, но используйте фигурные скобки для блочных и более коротких блочных переменных. И вам не нужен второй presence

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

#merge!#merge) с блоком только вызывает блок для обработки случаев, когда ключ присутствует в обоих хешах. Там, где option_hash ключи отсутствуют в main_hash, пара ключ / значение просто вставляется.

Вы можете использовать #merge! с блоком, чтобы сделать несколько хитрых трюков, например, настроить общую сумму хеш-значений.

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}
1 голос
/ 27 марта 2019

Это короче, но я думаю, что ваш путь более читабелен.

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

0 голосов
/ 27 марта 2019
[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: отклонить! для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...