【发布时间】:2019-02-02 00:47:24
【问题描述】:
我已经阅读了一些关于哈希与块合并的内容,这对于普通 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 的信息,但不确定如何使用它。有没有一种聪明的方法来完成子哈希值的合并?你认为最简单的方法是什么?
【问题讨论】:
-
如果你在 Rails 上,试试
a.deep_merge(b) { |key, value_a, value_b| value_a + value_b } -
我使用的是纯红宝石 :(
-
在第二种情况下
a.merge(b)的预期输出是什么,似乎没有什么可以合并的,因为两个键不重合。 -
Enumerable#each_with_object 只是节省了几个步骤。例如,如果您写了
def doit(arr); a = []; arr.each { |n| a << 2*n if n.odd? }; a; end,则可以通过写def doit(arr); arr.each_with_object([]) { |n,a| a << 2*n if n.odd? }; end来消除第一个和最后一个语句。