如何简化在Ruby中创建深度嵌套的哈希?

我目前有:

@teams ||= {}
@teams[date] ||= {}
@teams[date][team] ||= {}
@teams[date][team][raw_address] ||= {}
@teams[date][team][raw_address]['address'] = address
@teams[date][team][raw_address]['orders'] ||= {}
@teams[date][team][raw_address]['orders'][order.id] = order

是否可以“删除”包含||= {}? 我只想有这样的东西:

@teams[date][team][raw_address]['address'] = address
@teams[date][team][raw_address]['orders'][order.id] = order

回答

您可能知道在 Ruby 中,散列可以有默认值。

因此,在最初创建@team散列时,您可以设置默认值,例如空散列

@team = Hash.new { |h, k| h[k] = Hash.new }

这给了你:

@team[:foo] #=> {}

以及在那些动态创建的散列中设置值的能力,例如:

@team[:foo][:bar] = 123
@team[:foo][:baz] = 456

@team
#=> {
#     :foo => {
#       :bar => 123,
#       :baz => 456
#     }
#   }

但这仅适用于第一级。要获得可以无限嵌套的散列,您必须将外部散列传递default_proc给内部散列:

@team = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }

这样做允许您通过分配最后一个元素来创建深度嵌套的哈希,例如:

@team[:foo][:bar][:baz] = 123
@team[:foo][:bar][:qux][:quux] = 456

@team
#=> {
#     :foo=> {
#       :bar => {
#         :baz => 123,
#         :qux => {
#           :quux => 456
#         }
#       }
#     }
#   }


以上是如何简化在Ruby中创建深度嵌套的哈希?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>