在任意位置设置哈希值

时间:2013-04-01 13:14:42

标签: ruby

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

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

是:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

除了语法(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

答案 1 :(得分:1)

作为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的普查员。