Ruby通过引用更改哈希值

时间:2012-03-02 23:51:28

标签: 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" => {"d" => "e"}}

由于

编辑:

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

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

4 个答案:

答案 0 :(得分:1)

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

这是我写的真正旧的答案的链接(当我还在积极使用ruby时)。它没有处理赋值位,但我相信它显示了一个无eval的有效方法的开始:How do you access nested elements of a hash with a single string key?"目标对象"如果找到了,那么只需要为特定密钥分配新值。 (链接帖子中接受的答案也是一个宝石,如果不是更多的神秘和符号泄漏。)

快乐的编码。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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"})

答案 3 :(得分:0)

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

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

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