如果你拿哈希:
{
:element => {
:to_find => 'found me'
},
:element_2 => {
:inner_element => {
:n_elements => {
:to_find => 'found me'
}
:do_not_touch => 'still here'
}
}
}
我怎样才能找到并用'changed'替换:to_find?
我试过了
(hash).update(hash){|k,v| (([:to_find].include? k) ? 'changed' : v}
然而这只是一个深刻的。
我可以做一个递归函数,如:
def change_keys(hash, keys, new_value)
(hash).update(hash) do |k,v|
if (keys.include? k)
new_value
else
if v.class == Hash
find_key(v)
else
v
end
end
end
end
我测试过运行这个,有效:
change_keys(my_hash, [:to_find], 'changed')
但是,有更干净的方式吗?
递归方法是可行的方法,但你可以让它更清洁......
def change_keys(hash, keys, new_value)
keys.each { |k| hash[k] = new_value if hash.has_key?(k) }
hash.values.each { |v| change_keys(v, keys, new_value) if v.class == Hash }
end
我想你可以尝试这样的事情
eval({
:x => 'y',
:q =>
{
:x => 'y',
:s =>
{
:x => 'y'
}
}
}.to_s.gsub(/:x=>"."/, ':x=> "new_value"')
)