5

がありHash、深いレベルでデータを挿入したいのですが、どのレベルでもキーが欠落している可能性があります。したがって、すべてのレベルで値を更新する前に、条件付きで初期化しています。

これを書くためのより良い方法や、コードの見苦しさを軽減する方法は何でしょうか?

data[:foo] ||= {}
data[:foo][:bar] ||= {}
data[:foo][:bar][:baz] ||= []
data[:foo][:bar][:baz] << 99
4

3 に答える 3

9

ハッシュの自動有効化を使用:

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
于 2018-05-22T12:55:35.977 に答える