2

ここに私が得たものがあります:

hash = {:a => {:b => [{:c => old_val}]}}
keys = [:a, :b, 0, :c]
new_val = 10

ハッシュ構造とキーのセットは異なる場合があります。
私は得る必要があります

hash[:a][:b][0][:c] == new_val

ありがとう!

4

2 に答える 2

6

injectネストされた構造をトラバースするために使用できます。

hash = {:a => {:b => [{:c => "foo"}]}}
keys = [:a, :b, 0, :c]

keys.inject(hash) {|structure, key| structure[key]}
# => "foo"

したがって、これを変更して、最後のキーでセットを行う必要があります。おそらく次のようなもの

last_key = keys.pop
# => :c

nested_hash = keys.inject(hash) {|structure, key| structure[key]}
# => {:c => "foo"}

nested_hash[last_key] = "bar"

hash
# => {:a => {:b => [{:c => "bar"}]}}
于 2012-12-13T09:30:58.517 に答える
3

Andy's に似ていますがSymbol#to_proc、短くするために使用できます。

hash = {:a => {:b => [{:c => :old_val}]}}
keys = [:a, :b, 0, :c]
new_val = 10
keys[0...-1].inject(hash, &:fetch)[keys.last] = new_val
于 2012-12-13T09:43:16.573 に答える