我有一个Hash,我想在深层插入一些数据,但任何级别的密钥都可能丢失.所以,我在每个级别更新它的值之前有条件地初始化它.
什么是更好的方式来编写这个或一种可以使代码不那么难看的方法?
data[:foo] ||= {}
data[:foo][:bar] ||= {}
data[:foo][:bar][:baz] ||= []
data[:foo][:bar][:baz] << 99
Run Code Online (Sandbox Code Playgroud)
使用哈希自动生成:
data = Hash.new { |h, k| h[k] = h.dup.clear }
#? {}
# or, credits to @Amadan:
data = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
#? {}
data[:foo][:bar][:baz] = 42
data
#? {:foo=>{:bar=>{:baz=>42}}}
Run Code Online (Sandbox Code Playgroud)
这里使用的技巧是我们Hash#default_proc用来创建嵌套键.
对于你的情况:
(data[:foo][:bar][:baz] = []) << 99
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |