如何简化在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
# }
# }
# }
# }