更好的方法来初始化和更新深层嵌套的Hash

Jag*_*ngh 3 ruby ruby-hash

我有一个Hash,我想在深层插入一些数据,但任何级别的密钥都可能丢失.所以,我在每个级别更新它的值之前有条件地初始化它.

什么是更好的方式来编写这个或一种可以使代码不那么难看的方法?

data[:foo] ||= {}
data[:foo][:bar] ||= {}
data[:foo][:bar][:baz] ||= []
data[:foo][:bar][:baz] << 99
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 7

使用哈希自动生成:

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)

  • `Hash.new {| h,k | h [k] = Hash.new(&h.default_proc)}`效率更高一些. (5认同)
  • 嗯,信用,好像我发明了它:D无论如何,它是一个已知的咒语,名称有点鲜为人知:"哈希自动化". (3认同)