Ruby通过引用更改哈希值

我正在使用eval来处理哈希。 这部分有效:

some_hash = {"a" => {"b" => "c"}} target_hash = "some_hash" target_key = "['a']" my_value = eval(target_hash + target_key) puts "my_value " + my_value.to_s 

和打印:

 my_value {"b"=>"c"} 

如何使用eval更改值,以便哈希导致:

 some_hash = {"a" => {"d" => "e"}} 

谢谢

编辑:

我认为我没有正确解释。 我必须深入研究哈希,但我希望能够灵活地使用在运行时设置的字符串。 该字符串可以是"['key_level_1']['key_level_2']['key_level_3']" ,它应该引用some_hash['key_level_1']['key_level_2']['key_level_3']

而且,我需要将这个值设置为某种东西。 那有意义吗?

我会采用一个数组,例如['key1', 'key2', 'key3'] (可以从适当格式化的字符串构造)和“根对象”,并使用它来定位特定的“目标对象”分支(I会推荐递归)。 然后操纵所找到的相应对象。 在这种情况下, some_hash应该是开始遍历的“根对象”,而不是字符串。

这是我写的一个非常古老的答案的链接(当我仍然积极使用ruby时)。 它不处理赋值位,但我相信它显示了一个无eval的有效方法的开始: 如何使用单个字符串键访问哈希的嵌套元素? 找到“目标对象”之后,只需要为特定键分配新值即可。 (链接post中接受的答案也是一个gem,如果不是更多的神秘和符号泄漏。)

快乐的编码。

你可以使用Hash#replace

 def changeHash(a, b, targetHash, targetKey) change = ".replace({'#{a}' => '#{b}'})" my_value = eval(target_hash + target_key + change) end some_hash = {"a" => {"b" => "c"}} target_key = "['a']" changeHash('d', 'e', 'some_hash', '["a"]') 

我建议设置一个这样的方法:

 def hash_change(target_hash,target_key,*new_value) if new_value target_hash["target_key"] = new_value end puts "my_value " + target_hash["target_key"] end 

如果传递新值,这将使您可以灵活地显示原始哈希值或新哈希值。

编辑:抱歉忘了调用方法

 hash_change(some_hash,"a",{"d" => "e"}) 

谢谢大家的帮助。 我把它改了一下。 我只是传入一个这样的对象,而不是将字符串作为数组传递:

 {some_hash => {"a" => {"b" => "nil"}}} 

然后我递归遍历引用和真正的哈希。 当我在参考中检测到nil时,我知道我在那里。