为什么try 存储Hash.new({})
的嵌套值的工作方式是这样的?引擎盖下到底发生了什么?它的用例是什么?
当创建具有默认值{}的哈希时,
a = Hash.new({})
=> {}
a.default
=> {}
如预期的那样,查询不存在的键将返回空散列
a[:foo]
=> {}
但是,当try 为尚不存在的键赋值时
a[:foo][:bar] = 'baz'
=> "baz"
散列仍然看起来是空的
a
=> {}
但是,获取父键将返回嵌套的散列.
a[:foo]
=> {:bar=>"baz"}
更令人困惑的是,这个新散列现在已成为父散列的缺省值
a.default
=> {:bar=>"baz"}
以便查询不存在键将返回该值
a[:biz]
=> {:bar=>"baz"}
这可以通过做以下事情来解决
a[:foo] = {} unless a.key? :foo
a[:foo][:bar] = 'baz'
a
=> {:foo=>{:bar=>"baz"}}
其他类似的问题也建议a = Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }
,它用于存储新的键,但也为获取操作创建空哈希,例如.
a[:baz] == 2
a
=> {:baz=>{}}
除了编写方法之外,是否有其他方法可以在存储值时获取散列以创建嵌套散列,而不是在取值时获取散列?