がありHash
、深いレベルでデータを挿入したいのですが、どのレベルでもキーが欠落している可能性があります。したがって、すべてのレベルで値を更新する前に、条件付きで初期化しています。
これを書くためのより良い方法や、コードの見苦しさを軽減する方法は何でしょうか?
data[:foo] ||= {}
data[:foo][:bar] ||= {}
data[:foo][:bar][:baz] ||= []
data[:foo][:bar][:baz] << 99
ハッシュの自動有効化を使用:
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}}}
ここで使用されるトリックはHash#default_proc
、ネストされたキーを作成するために使用することです。
あなたの場合:
(data[:foo][:bar][:baz] = []) << 99