2016-01-05 4 views
10
h = { 
    data: { 
    user: { 
     value: "John Doe" 
    } 
    } 
} 

をネストされたハッシュに値を割り当てるには真ん中のどの部分が欠落している場合、我々はしかしは、安全ハッシュ#掘るかロンリー演算子を使用して、ネストされたハッシュに値を代入(&)

h[:data][:user][:value] = "Bob" 

を使用することができますエラーが発生します。まだ使用可能なHash#dig=はありませんので、

h.dig(:data, :user, :value) = "Bob" 

よう

何かが、動作しません。 、我々は

h.dig(:data, :user)&.[]=(:value, "Bob") # or equivalently 
h.dig(:data, :user)&.store(:value, "Bob") 

を行うことができます

は安全に値を割り当てるには、しかし、それを行うには良い方法はありますか?

+2

何が価値があるために、これは(ここでは議論されてきましたMatzによって拒否されました(当分の間):https://bugs.ruby-lang.org/issues/11747 –

答えて

8

それは(あなたが他の場所からハッシュを受信して​​いる場合は動作しません)その警告なしではありませんが、一般的な解決策はこれです:

hash = Hash.new {|h,k| h[k] = h.class.new(&h.default_proc) } 

hash[:data][:user][:value] = "Bob" 
p hash 
# => { :data => { :user => { :value => "Bob" } } } 
+0

残念ながら、ハッシュは他の場所からのものでしたが、スニペットに感謝! – sbs

+4

デフォルトのprocを設定することもできます既存のハッシュの場合: 'hsh.default_proc = proc {| h、k | h [k] = Hash.new(&h.default_proc)}' – Stefan

関連する問題