hash.merge с блоком для добавления дополнительных ключей хеша? - PullRequest
0 голосов
/ 02 февраля 2019

Я прочитал кое-что о слиянии хэшей с блоком, и это работает нормально для простых, не вложенных хэшей в обычном ruby.Следующий код приводит к {1=>2, 2=>4, 4=>6}, как и ожидалось:

a = {1 => 1, 2 => 2, 4 => 3}
b = {1 => 1, 2 => 2, 4 => 3}
a.merge(b) { |key, value_a, value_b | value_a + value_b }

Но слияние не работает для вложенной хэш-структуры, я получаю NoMethodError (undefined method '+' for {1=>1, 2=>2}:Hash)

a = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
b = { "2019" => {1 => 1, 2 => 2, 4 => 3} }
c = a.merge(b) { |key, value_a, value_b | value_a + value_b }

Я прочитало each_with_object , и я не уверен, как его использовать.Есть ли умный способ выполнить слияние значений подхеша?Как вы думаете, это самый простой способ?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Вложенный Hash, вложенный Hash#merge?

Я изменил ключ b на "2018"

a = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
b = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
c = a.merge(b) { |k, v1, v2| v1.merge(v2) { |kk, aa, bb | aa + bb } }

#=> {"2018"=>{1=>2, 2=>4, 4=>6}}

Для ваших исходных значений:

a = { "2018" => {1 => 1, 2 => 2, 4 => 3} }
b = { "2019" => {1 => 1, 2 => 2, 4 => 3} }

Результат

#=> {"2018"=>{1=>1, 2=>2, 4=>3}, "2019"=>{1=>1, 2=>2, 4=>3}}
0 голосов
/ 02 февраля 2019

Вы можете использовать Hash # deep_merge из активной поддержки, чтобы сделать это.

require 'active_support/all'

a = { k1: { k2: 1 } }
b = { k1: { k2: 2 } }

a.deep_merge(b) { |k, v1, v2| v1 + v2 }
# => { l1: { k2: 3 } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...