Ruby通过引用更改哈希中的值

Ruby通过引用更改哈希中的值,ruby,reference,Ruby,Reference,我用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"

我用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\u level\u 1']['key\u level\u 2']['key\u level\u 3']
,它应该是指
一些散列['key\u level\u 1']['key\u level\u 2']['key\u level\u 3']


再一次,我需要将该值设置为某个值。这有意义吗?

我建议设置如下方法:

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
{some_hash => {"a" => {"b" => "nil"}}}
这将使您能够灵活地在传入新值时显示原始哈希或新哈希

编辑:抱歉,忘记了对方法的调用

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

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

这里有一个链接,指向我写的一个非常古老的答案(当时我仍在积极使用ruby)。它不处理赋值位,但我相信它显示了一个无需评估的有效方法的开始:在找到“目标对象”后,只需为特定的键分配一个新值。(链接帖子中被接受的答案也是一块宝石,如果不是有点神秘和符号泄露的话。)


快乐的编码。

谢谢大家的帮助。我把它改了一点。我没有将字符串作为数组传入,而是传入如下对象:

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
{some_hash => {"a" => {"b" => "nil"}}}
然后递归遍历引用和实际哈希。当我在引用中检测到
nil
时,我知道我在那里。

您可以使用
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"]')

考虑不要使用邪恶-厄尔,埃弗这里。在一般情况下,有很多“干净的方法”来处理这个问题。哈,我知道有人会这么说。有什么提示吗?请看我下面的评论,谢谢。不,说真的,这太糟糕了。没有理由使用“[“a”]”,而“a”可以。您不需要参数化语法!我认为我的解释不对。我必须深入到散列中,但我希望能够灵活地使用在运行时设置的字符串。该字符串可以是“['key_level_1']['key_level_2']['key_level_3']”,它应该是指一些散列['key_level_1']['key_level_2']['key_level_3']。再一次,我需要将该值设置为某个值。这有道理吗?是的,我没听你的。你有没有一个更具体的例子可以说明这个问题?