在任意位置设置哈希值

我正在开发一个应用程序,我想修改现有哈希的一部分,如下所示:

{a: {b: {c: 23}}} 

成为:

 {a: {b: {c: [23]}}} 

但是,要设置的确切键是动态的,并且在散列中处于未知深度。 有没有办法在给定一组键的哈希值中设置一个值? 我希望有类似的东西:

 my_hash['a','b','c'] = new_value 

通过递归从任意深度获取值很简单,但由于遍历适用于数据的副本而不是引用,我不知道在遍历期间不重建整个数组而设置值的方法。

除了语法( my_hash['a','b','c'] ),以下将做你想要的

 h = {a: {b: {c: { e: 23}}, d: 34}} keys = ['a','b','c'] def replace_nested_value_by(h, keys, value) if keys.size > 1 replace_nested_value_by(h[keys.first.to_sym], keys[1..-1], value) elsif keys.size == 1 h[keys.first.to_sym] = value end end puts h replace_nested_value_by(h, keys, 42) puts h 

作为toch的答案的补充,只是略微超出评论范围,我还建议这可以是一个使用inject的好地方:

 def nested_replace(hash, *keys, last_key, value) result = keys.inject(hash) { |r, k| r[k] } result[last_key] = value end h = {a: {b: {c: [23]}}} nested_replace h, :a, :b, :c, 42 puts h # => {:a=>{:b=>{:c=>42}}} 

就个人而言,如果在查看递归之前有一种自然的表达方式,我倾向于选择Ruby的枚举器。